На входе имеется информация о донациях разбитая на несколько датасетов, необходимо провести исследовательский анализ данных и выявить закономерности которые позволят заказчику обратить внимание на слабые стороны проекта чтобы найти решения для улучшения показателей.
Моя задача обратить внимание на неравномерное распределение донаций по территории страны, и найти способы улучшить положение в отстающих регионах. Дополняет проект дашборд предназначенный для помощи отделу рекламы, в нем содержится сжатая информация показателей раскрытых в проекте. Показатели могут отличаться, т.к. заказчик подгружает в дашборд свежие изменения в данных.
В проекте содержатся сторонние данные взятые с просторов интернета. Это было необходимо для возможности визуализации карт с донациями по областям, регионам и городам. Сторонние датасеты проверены на актуальность и согласованы с заказчиком.
Цели проекта:
● Найти способы привлечения количества новых доноров
● Найти способы увеличить лайфтайм уже имеющихся доноров
Задачи проекта:
● Анализ поведения доноров
● Оценка влияния событий на регистрацию
новых и вовлечение существующих доноров
● Анализ данных группы ВК
● Сбор лучших зарубежных практик
● Формирование рекомендаций
● Создание дашборда
#импортируем бибилиотеки
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as st
from IPython.display import FileLink
import seaborn as sns
import plotly.express as px
from plotly import graph_objects as go
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected=True)
import datetime as dt
from datetime import datetime,timedelta
import math
#Для сложных манипуляций с картами
import folium
from folium import Map, Marker
from folium.plugins import MarkerCluster
from folium import Map, Choropleth
from folium.features import CustomIcon
from branca.colormap import linear
import re
from shapely import wkt
from mpl_toolkits.axes_grid1 import make_axes_locatable
import warnings
warnings.filterwarnings("ignore")
#Снятие ограничений
pd.set_option("display.max_columns",None)
def inform(df):
display(df.head()) # вывод первых 5 строк таблицы
df.info() # получение информации
print ('Количество дубликатов -', df.duplicated().sum()) # проверка на дубликаты
print ('Число пропусков -',df.isna().sum())# число пропусков
print ('Доля пропусков -',df.isna().mean())
display(df.describe()) #описательные статистики
return df
Функция расчета диапазона дат
def get_date_range_info(df, date_field):
min_date = df[date_field].min()
max_date = df[date_field].max()
diff = max_date - min_date
return 'Данные представлены за период от %s до %s, разница в %s.' % (min_date, max_date, diff)
#Локальный путь нахождения файлов с данными (заменить при загрузке с другого источника)
patch = 'C:/Users/79990/Desktop/donor/d_search/'
bs_data 13.11.23.csv- агрегированные данные по центрам сдачи крови¶ID центра крови- Уникальный идентификатор центра крови.
Город- Город центра крови.
Cтрана- Страна центра крови.
Донаций добавлено- Сколько подтвержденных донаций, сделанных в этом
центре, добавлено на сайте за все время его работы.
Доноров- Сколько уникальных доноров загрузили данные о сдаче кровь или ее
компонентов в этом центре крови за все время работы сайта.
#Загрузка датасета
df_bs = pd.read_csv(patch + 'bs_data 13.11.23.csv')
df_bs = inform(df_bs)
| ID центра крови | Город | Cтрана | Донаций добавлено | Доноров | |
|---|---|---|---|---|---|
| 0 | 633 | Москва | Россия | 10037 | 1263 |
| 1 | 880 | Казань | Россия | 6931 | 589 |
| 2 | 366 | Уфа | Россия | 6681 | 1250 |
| 3 | 838 | Казань | Россия | 6376 | 1469 |
| 4 | 571 | Нижневартовск | Россия | 5423 | 260 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 1065 entries, 0 to 1064 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID центра крови 1065 non-null int64 1 Город 1065 non-null object 2 Cтрана 1065 non-null object 3 Донаций добавлено 1065 non-null int64 4 Доноров 1065 non-null int64 dtypes: int64(3), object(2) memory usage: 41.7+ KB Количество дубликатов - 0 Число пропусков - ID центра крови 0 Город 0 Cтрана 0 Донаций добавлено 0 Доноров 0 dtype: int64 Доля пропусков - ID центра крови 0.0 Город 0.0 Cтрана 0.0 Донаций добавлено 0.0 Доноров 0.0 dtype: float64
| ID центра крови | Донаций добавлено | Доноров | |
|---|---|---|---|
| count | 1065.000000 | 1065.000000 | 1065.000000 |
| mean | 548.519249 | 215.042254 | 45.200000 |
| std | 314.807337 | 690.081821 | 124.449896 |
| min | 1.000000 | 0.000000 | 0.000000 |
| 25% | 277.000000 | 1.000000 | 1.000000 |
| 50% | 549.000000 | 17.000000 | 5.000000 |
| 75% | 820.000000 | 115.000000 | 28.000000 |
| max | 1101.000000 | 10037.000000 | 1469.000000 |
В этой таблице неожиданностей нет: данные соответствуют типам и проблем нет.
df_bs.columns = df_bs.columns.str.lower().str.replace(' ', '_')
df_bs.columns
Index(['id_центра_крови', 'город', 'cтрана', 'донаций_добавлено', 'доноров'], dtype='object')
df_bs.город.unique()
array(['Москва', 'Казань', 'Уфа', 'Нижневартовск', 'Красноярск', 'Сургут',
'Самара', 'Екатеринбург', 'Кемерово', 'Санкт-Петербург', 'Саратов',
'Ярославль', 'Новосибирск', 'Тюмень', 'Нижний Новгород', 'Иваново',
'Ростов-на-Дону', 'Смоленск', 'Набережные Челны', 'Благовещенск',
'Волгоград', 'Барнаул', 'Челябинск', 'Белгород', 'Владивосток',
'Тверь', 'Иркутск', 'Краснодар', 'Томск', 'Воронеж', 'Альметьевск',
'Брянск', 'Симферополь', 'Ульяновск', 'Петропавловск-Камчатский',
'Калуга', 'Оренбург', 'Тольятти', 'Ижевск', 'Хабаровск', 'Тула',
'Ставрополь', 'Пенза', 'Липецк', 'Рязань', 'Чебоксары', 'Орёл',
'Петрозаводск', 'Пермь', 'Стерлитамак', 'Калининград', 'Тамбов',
'Мурманск', 'Омск', 'Новокузнецк', 'Курск', 'Киров',
'Магнитогорск', 'Йошкар-Ола', 'Саранск', 'Владимир', 'Архангельск',
'Сызрань', 'Астрахань', 'Рыбинск', 'Волжский', 'Улан-Удэ', 'Ухта',
'Южно-Сахалинск', 'Нижний Тагил', 'Севастополь', 'Октябрьский',
'Первоуральск', 'Великий Новгород', 'Курган', 'Чита', 'Керчь',
'Кострома', 'Нефтеюганск', 'Донецк', 'Нижнекамск', 'Подольск',
'Череповец', 'Пятигорск', 'Сыктывкар', 'Ханты-Мансийск',
'Махачкала', 'Шахты', 'Канск', 'Сочи', 'Братск', 'Старый Оскол',
'Вологда', 'Лесосибирск', 'Дзержинск', 'Минск', 'Орск', 'Тобольск',
'Ачинск', 'Энгельс', 'Усть-Илимск', 'Таганрог', 'Михайловка',
'Краснотурьинск', 'Люберцы', 'Якутск', 'Балаково', 'Абакан',
'Харьков', 'Новороссийск', 'Киев', 'Ангарск', 'Кирово-Чепецк',
'Ишим', 'Шуя', 'Псков', 'Новомосковск', 'Майкоп', 'Бийск',
'Одесса', 'Одинцово', 'Кумертау', 'Щёлково', 'Уссурийск',
'Минусинск', 'Димитровград', 'Каменск-Уральский', 'Златоуст',
'Наро-Фоминск', 'Грозный', 'Лермонтов', 'Орехово-Зуево',
'Серпухов', 'Ялта', 'Вичуга', 'Ейск', 'Миасс', 'Верхняя Пышма',
'Жуковский', 'Воскресенск', 'Кинешма', 'Ноябрьск', 'Астана',
'Пушкино', 'Коломна', 'Черкесск', 'Королёв',
'Комсомольск-на-Амуре', 'Норильск', 'Химки', 'Ржев', 'Балашиха',
'Сумы', 'Воркута', 'Волжск', 'Обнинск', 'Караганда', 'Когалым',
'Запорожье', 'Анапа', 'Раменское', 'Березники', 'Мончегорск',
'Сергиев Посад', 'Ногинск', 'Мирный', 'Россошь', 'Алма-Ата',
'Петропавловск', 'Камышин', 'Мытищи', 'Куйбышев', 'Вязники',
'Белорецк', 'Новый Уренгой', 'Гатчина', 'Элиста', 'Николаев',
'Красногорск', 'Владикавказ', 'Днепропетровск', 'Рубцовск',
'Биробиджан', 'Елец', 'Кызыл', 'Тихвин', 'Волгодонск', 'Советск',
'Асбест', 'Печора', 'Кишинев', 'Балашов', 'Дмитров', 'Армавир',
'Находка', 'Инта', 'Луганск', 'Витебск', 'Пушкин',
'Усолье-Сибирское', 'Тосно', 'Нефтекамск', 'Евпатория', 'Уральск',
'Салехард', 'Черкассы', 'Вельск', 'Озерск', 'Геленджик',
'Арсеньев', 'Электросталь', 'Яранск', 'Кривой Рог', 'Винница',
'Надым', 'Белогорск', 'Нерюнгри', 'Глазов', 'Байконур', 'Бишкек',
'Урай', 'Кореновск', 'Бирск', 'Удомля', 'Муром', 'Нальчик',
'Мегион', 'Вольск', 'Стрежевой', 'Белово', 'Железногорск',
'Белоярский', 'Клин', 'Прокопьевск', 'Шадринск', 'Мценск',
'Дербент', 'Ивантеевка', 'Мариуполь', 'Павлодар', 'Магадан',
'Александровск-Сахалинский', 'Радужный', 'Усть-Каменогорск',
'Актобе', 'Новочеркасск', 'Новый Оскол', 'Междуреченск', 'Видное',
'Шемордан', 'Голицыно', 'Гродно', 'Фурманов', 'Луховицы',
'Горно-Алтайск', 'Полевской', 'Губкин', 'Можайск', 'Чайковский',
'Саяногорск', 'Миллерово', 'Анадырь', 'Великие Луки', 'Советский',
'Бердск', 'Шатура', 'Северск', 'Камышлов', 'Моздок', 'Новоуральск',
'Сатка', 'Сухой Лог', 'Лангепас', 'Сосновый Бор', 'Вышний Волочек',
'Урюпинск', 'Кунгур', 'Анжеро-Судженск', 'Выборг', 'Карасук',
'Львов', 'Кстово', 'Чернигов', 'Костанай', 'Билибино', 'Елизово',
'Хасавюрт', 'Серов', 'Артемовский', 'Ступино', 'Чехов',
'Белая Калитва', 'Алапаевск', 'Бобруйск', 'Новокубанск',
'Костомукша', 'Брест', 'Тирасполь', 'Ефремов', 'Могилев',
'Зеленогорск', 'Ливны', 'Беломорск', 'Темрюк', 'Усинск', 'Гомель',
'Касимов', 'Ростов', 'Краматорск', 'Павловск', 'Тимашевск',
'Качканар', 'Фрязино', 'Кокшетау', 'Вятские Поляны', 'Белореченск',
'Слободской', 'Кировск', 'Североморск', 'Юрга', 'Данков',
'Домодедово', 'Егорьевск', 'Салават', 'Сальск', 'Тарко-Сале',
'Котлас', 'Туапсе', 'Сарапул', 'Нягань', 'Херсон', 'Старая Русса',
'Крымск', 'Кизел', 'Полтава', 'Феодосия', 'Актау', 'Тернополь',
'Калач', 'Боровичи', 'Бузулук', 'Южноуральск', 'Хмельницкий',
'Нарьян-Мар', 'Новопокровская', 'Мозырь', 'Бельцы', 'Доброполье',
'Кропоткин', 'Приморско-Ахтарск', 'Арзамас', 'Гусиноозерск',
'Ирбит', 'Саянск', 'Заречный', 'Кременчуг', 'Котельнич', 'Онега',
'Ахтубинск', 'Павловский Посад', 'Можга', 'Макеевка', 'Муравленко',
'Кировоград', 'Северодвинск', 'Кашира', 'Гулькевичи', 'Искитим',
'Мелитополь', 'Ташкент', 'Соликамск', 'Днепродзержинск', 'Лесной',
'Борисоглебск', 'Холмск', 'Талица', 'Лабытнанги', 'Житомир',
'Белая Церковь', 'Дубна', 'Ровно', 'Лесозаводск', 'Волхов',
'Славгород', 'Протвино', 'Каневская', 'Черногорск', 'Смирных',
'Джанкой', 'Камень-на-Оби', 'Бобров', 'Всеволожск', 'Добрянка',
'Краснокаменск', 'Волоколамск', 'Сергач', 'Воротынец', 'Выкса',
'Елабуга', 'Невельск', 'Реж', 'Тараз', 'Пинск', 'Tallinn', 'Луцк',
'Алушта', 'Кириши', 'Борисов', 'Великий Устюг', 'Кингисепп',
'Зеленодольск', 'Алдан', 'Каменск-Шахтинский', 'Омутнинск',
'Учалы', 'Югорск', 'Коркино', 'Губкинский', 'Ивано-Франковск',
'Лубны', 'Атырау', 'Осинники', 'Зарайск', 'Лысьва', 'Белебей',
'Нижнеангарск', 'Рузаевка', 'Бердянск', 'Саки', 'Заволжье',
'Углегорск', 'Ленинск-Кузнецкий', 'Буденновск', 'Углич',
'Черновцы', 'Рудный', 'Бендеры', 'Мыски', 'Грязи', 'Павлово',
'Губаха', 'Ишимбай', 'Кизилюрт', 'Назрань', 'Ревда', 'Канаш',
'Измаил', 'Алчевск', 'Рогачев', 'Кагул', 'Кременная', 'Саров',
'Ковров', 'Алексеевка', 'Кольчугино', 'Острогожск', 'Южа',
'Березовский', 'Балахна', 'Красновишерск', 'Татарск', 'Пудож',
'Объячево', 'Речица', 'Никополь', 'Барановичи', 'Свободный',
'Гусь-Хрустальный', 'Сухиничи', 'Уржум', 'Шарья', 'Мостовской',
'Апшеронск', 'Лыткарино', 'Кудымкар', 'Бугульма', 'Междуреченский',
'Стаханов', 'Северодонецк', 'Бахчисарай', 'Умань', 'Комсомольск',
'Сортавала', 'Ужгород', 'Бор', 'Фастовецкая', 'Бровары', 'Тбилиси',
'Семипалатинск', 'Цюрупинск', 'Düsseldorf', 'Тара', 'Дальнегорск',
'Северская', 'Галич', 'Динская', 'Лодейное Поле', 'Апатиты',
'Солнечногорск', 'Рошаль', 'Купино', 'Чусовой', 'Медвежьегорск',
'Сегежа', 'Воткинск', 'Азов', 'Богданович', 'Красноуфимск',
'Новочебоксарск', 'Туймазы', 'Ленск', 'Краснодон',
'Новотроицкое пгт', 'Безенчук', 'Туринская Слобода', 'Светловодск',
'Синельниково', 'Тихорецк', 'Лида', 'Алейск', 'Клинцы', 'Шелехов',
'Мариинск', 'Зуевка', 'Полтавская', 'Усмань', 'Истра',
'Звенигород', 'Валдай', 'Каргат', 'Исилькуль', 'Соль-Илецк',
'Лысково', 'Окуловка', 'Сузун', 'Шербакуль', 'Кондопога',
'Прохладный', 'Карачаевск', 'Лениногорск', 'Торбеево', 'Кукмор',
'Североуральск', 'Верхняя Салда', 'Невьянск', 'Кушва', 'Тавда',
'Копейск', 'Колпашево', 'Таштагол', 'Дюртюли', 'Азнакаево',
'Старый Крым', 'Десногорск', 'Энергодар', 'Зарафшан', 'Комрат',
'Орджоникидзе', 'Павлоград', 'Коростень', 'Ереван', 'Яровое',
'Поронайск', 'Знаменск', 'Степное Озеро', 'Заринск', 'Новоалтайск',
'Тальменка', 'Троицкое', 'Завьялово', 'Няндома', 'Енотаевка',
'Лиман', 'Нариманов', 'Черный Яр', 'Красный Яр', 'Харабали',
'Шебекино', 'Новозыбков', 'Александров', 'Валуйки', 'Жуковка',
'Карачев', 'Климово', 'Унеча', 'Калач-на-Дону', 'Котово', 'Сокол',
'Бутурлиновка', 'Ленинское', 'Облучье', 'Смидович', 'Амурзет',
'Малоярославец', 'Промышленная ', 'Мантурово', 'Буй', 'Тулун',
'Боровск', 'Вилючинск', 'Гурьевск', 'Тисуль', 'Нолинск',
'Крыловская', 'Кущевская', 'Славянск-на-Кубани', 'Староминская',
'Омсукчан', 'Дебин', 'Сеймчан', 'Сусуман', 'Ягодное', 'Кандалакша',
'Ковдор', 'Никель', 'Руза', 'Тбилисская', 'Успенское',
'Горячий Ключ', 'Павловская', 'Брюховецкая', 'Кавказская',
'Старощербиновская', 'Озёры', 'Красково', 'Яшкино ',
'Красные Баки', 'Лукоянов', 'Чистоозерное', 'Калачинск',
'Муромцево', 'Верещагино', 'Краснокамск', 'Ардатов', 'Богородск',
'Ветлуга', 'Дальнее Константиново', 'Кулебаки', 'Навашино',
'Семенов', 'Сосновское', 'Урень', 'Чудово', 'Сольцы', 'Кочки',
'Краснозерское', 'Чаны', 'Большеречье', 'Крутинка', 'Называевск',
'Черлак', 'Раевский', 'Сибай', 'Чишмы', 'Буйнакск', 'Каспийск',
'Кемь', 'Баймак', 'Бижбуляк', 'Киргиз-Мияки', 'Давлеканово',
'Багдарин', 'Закаменск', 'Кяхта', 'Петропавловка', 'Кизляр',
'Орджоникидзевская', 'Малгобек', 'Зеленчукская', 'Медногорский',
'Суоярви', 'Чупа', 'Комсомольский', 'Чистополь', 'Козьмодемьянск',
'Ковылкино', 'Краснослободск', 'Алагир', 'Заинск', 'Мамадыш',
'Нурлат', 'Ак-Довурак', 'Чадан', 'Туран', 'Морозовск',
'Новошахтинск', 'Скопин', 'Пугачев', 'Шилово', 'Новомичуринск',
'Ряжск', 'Сасово', 'Спасск-Рязанский', 'Шацк', 'Долинск',
'Советская Гавань', 'Октябрьское', 'Певек', 'Каргасок', 'Амурск',
'Чегдомын', 'Вяземский', 'Ванино', 'Охотск', 'Переяславка',
'Николаевск-на-Амуре', 'Солнечный', 'Покачи', 'Данилов',
'Гаврилов-Ям', 'Баган', 'Михайлов', 'Отрадная', 'Курчатов',
'Серебряные Пруды', 'Починки', 'Шахунья', 'Крестцы', 'Пестово',
'Чернушка', '1 Янаул', 'Зубово-Полянское лесн-во', 'Борогонцы',
'Покровск', 'Чурапча', 'Спас-Клепики', 'Свердловск', 'Красный Луч',
'Первомайск', 'Сквира', 'Фастов', 'Мукачево', 'Свалява', 'Хуст',
'Теофиполь', 'Старая Синява', 'Виньковцы', 'Белогорье', 'Славута',
'Городок', 'Athina', 'Zhangye', 'Староконстантинов', 'Армянск',
'Восход', 'Сланцы', 'Самарканд', 'Бухара', 'Фергана', 'Нукус',
'Карши', 'Джизак', 'Чирчик', 'Житковичи', 'Боровляны', 'Warszawa',
'Новые Анены', 'Каменец-Подольский', 'Ясиноватая', 'Рыбница',
'Кисловодск', 'Боярка', 'Желтые Воды', 'Апостолово', 'Богородчаны',
'Золотоноша', 'Токмак', 'Баку', 'Душанбе', 'Ашхабад', 'Кашин',
'Оха', 'Браслав', 'Усть-Катав'], dtype=object)
df_bs.cтрана.value_counts()
Россия 852 Украина 104 _ 27 Беларусь 24 Казахстан 18 Узбекистан 15 Молдова 8 Грузия 3 Кыргызстан 3 Армения 2 Азербайджан 2 Эстония 1 Германия 1 Греция 1 Китай 1 Польша 1 Таджикистан 1 Туркменистан 1 Name: cтрана, dtype: int64
df_bs.cтрана.unique()
array(['Россия', '_', 'Беларусь', 'Украина', 'Казахстан', 'Молдова',
'Кыргызстан', 'Узбекистан', 'Эстония', 'Грузия', 'Германия',
'Армения', 'Греция', 'Китай', 'Польша', 'Азербайджан',
'Таджикистан', 'Туркменистан'], dtype=object)
df_bs.query('cтрана == "_"')
| id_центра_крови | город | cтрана | донаций_добавлено | доноров | |
|---|---|---|---|---|---|
| 118 | 714 | Донецк | _ | 434 | 67 |
| 236 | 773 | Запорожье | _ | 143 | 54 |
| 293 | 764 | Луганск | _ | 98 | 20 |
| 354 | 769 | Мариуполь | _ | 62 | 17 |
| 453 | 783 | Краматорск | _ | 30 | 10 |
| 486 | 791 | Херсон | _ | 25 | 14 |
| 511 | 969 | Доброполье | _ | 20 | 1 |
| 528 | 784 | Макеевка | _ | 18 | 9 |
| 538 | 793 | Мелитополь | _ | 16 | 7 |
| 578 | 737 | Запорожье | _ | 11 | 9 |
| 579 | 906 | Запорожье | _ | 11 | 10 |
| 622 | 794 | Бердянск | _ | 7 | 6 |
| 623 | 937 | Запорожье | _ | 7 | 5 |
| 653 | 781 | Алчевск | _ | 5 | 5 |
| 658 | 981 | Кременная | _ | 5 | 1 |
| 696 | 780 | Стаханов | _ | 3 | 2 |
| 697 | 782 | Северодонецк | _ | 3 | 3 |
| 715 | 1030 | Цюрупинск | _ | 3 | 2 |
| 741 | 777 | Краснодон | _ | 2 | 2 |
| 745 | 939 | Новотроицкое пгт | _ | 2 | 2 |
| 805 | 930 | Энергодар | _ | 1 | 1 |
| 1002 | 776 | Свердловск | _ | 0 | 0 |
| 1003 | 778 | Красный Луч | _ | 0 | 0 |
| 1004 | 779 | Первомайск | _ | 0 | 0 |
| 1043 | 974 | Ясиноватая | _ | 0 | 0 |
| 1044 | 991 | Луганск | _ | 0 | 0 |
| 1054 | 1039 | Токмак | _ | 0 | 0 |
Здесь, надо понимать, что знаком _ обозначены новые регионы РФ.
По этому датасету можно определить Топ-10 городов по числу доноров/ донаций.Долю донаций на 1 донора в разбивке по городам за представленный период.
donations_anon 281123.csv - данные о донациях.¶Донации пользователей
ID- Уникальный идентификатор строки.
ID пользователя- Уникальный идентификатор донора.
Класс крови- Что именно - цельную кровь или компоненты и какие - сдал
донор.
Дата донации- Дата донации.
Дата планирования- На какую дату запланирована донация. Проставляется
только если пользователь планировал ее на сайте заранее.
Тип донации- Возможны только 2 значения: Платно и Безвозмездно.
Город- Город, где была сделана донация.
Регион- Регион, где была сделана донация.
Страна- Страна, где была сделана донация.
Место сдачи- В каком медицинском учреждении была сделана донация.
Есть справка- Прислал ли пользователь скан/фото справки о донации.
Дата добавления донации- Кода донация была добавлена в базу.
Статус донации-Статус донации. Может принимать одно из пяти значений.
#Загрузка датасета
df_d = pd.read_csv(patch + 'donations_anon 281123.csv',sep=",")
df_d = inform(df_d)
| ID | ID пользователя | Класс крови | Дата донации | Дата планирования | Тип донации | Город | Регион | Страна | Место сдачи | Есть справка | Дата добавления донации | Статус донации | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 258752 | 230369 | Цельная кровь | 28.11.2023 | Не указана | Безвозмездно | Омск | Омская область | Россия | ГКБ скорой медицинской помощи № 1 г. Омска, от... | Да | 28.11.2023 | На модерации |
| 1 | 258751 | 271511 | Цельная кровь | 26.11.2010 | Не указана | Безвозмездно | Воронеж | Воронежская область | Россия | БУЗ ВО "Воронежская областная станция перелива... | Да | 28.11.2023 | На модерации |
| 2 | 258750 | 271511 | Цельная кровь | 07.08.2085 | Не указана | Безвозмездно | Воронеж | Воронежская область | Россия | БУЗ ВО "Воронежская областная станция перелива... | Да | 28.11.2023 | На модерации |
| 3 | 258749 | 271511 | Цельная кровь | 22.09.2010 | Не указана | Безвозмездно | Воронеж | Воронежская область | Россия | БУЗ ВО "Воронежская областная станция перелива... | Да | 28.11.2023 | На модерации |
| 4 | 258748 | 271511 | Тромбоциты | 12.09.2056 | Не указана | Безвозмездно | Воронеж | Воронежская область | Россия | БУЗ ВО "Воронежская областная станция перелива... | Да | 28.11.2023 | Удалена |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 249741 entries, 0 to 249740 Data columns (total 13 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID 249741 non-null int64 1 ID пользователя 249741 non-null int64 2 Класс крови 249741 non-null object 3 Дата донации 249741 non-null object 4 Дата планирования 249741 non-null object 5 Тип донации 249741 non-null object 6 Город 249741 non-null object 7 Регион 249741 non-null object 8 Страна 249741 non-null object 9 Место сдачи 249741 non-null object 10 Есть справка 249741 non-null object 11 Дата добавления донации 249741 non-null object 12 Статус донации 249741 non-null object dtypes: int64(2), object(11) memory usage: 24.8+ MB Количество дубликатов - 637 Число пропусков - ID 0 ID пользователя 0 Класс крови 0 Дата донации 0 Дата планирования 0 Тип донации 0 Город 0 Регион 0 Страна 0 Место сдачи 0 Есть справка 0 Дата добавления донации 0 Статус донации 0 dtype: int64 Доля пропусков - ID 0.0 ID пользователя 0.0 Класс крови 0.0 Дата донации 0.0 Дата планирования 0.0 Тип донации 0.0 Город 0.0 Регион 0.0 Страна 0.0 Место сдачи 0.0 Есть справка 0.0 Дата добавления донации 0.0 Статус донации 0.0 dtype: float64
| ID | ID пользователя | |
|---|---|---|
| count | 249741.000000 | 249741.000000 |
| mean | 129335.359268 | 154529.797238 |
| std | 74427.268186 | 81269.727143 |
| min | 1.000000 | 4.000000 |
| 25% | 64922.000000 | 116454.000000 |
| 50% | 129777.000000 | 152747.000000 |
| 75% | 193599.000000 | 227719.000000 |
| max | 258752.000000 | 276175.000000 |
Также переименуем колонки, приведем даты в нужный формат
df_d.columns = df_d.columns.str.lower().str.replace(' ', '_')
df_d['дата_донации'] = pd.to_datetime(df_d['дата_донации'], format='%d.%m.%Y', errors='coerce')
df_d['дата_донации']
0 2023-11-28
1 2010-11-26
2 2085-08-07
3 2010-09-22
4 2056-09-12
...
249736 2017-11-21
249737 2018-02-03
249738 2016-06-06
249739 2017-11-28
249740 2018-04-10
Name: дата_донации, Length: 249741, dtype: datetime64[ns]
df_d.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 249741 entries, 0 to 249740 Data columns (total 13 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 249741 non-null int64 1 id_пользователя 249741 non-null int64 2 класс_крови 249741 non-null object 3 дата_донации 249734 non-null datetime64[ns] 4 дата_планирования 249741 non-null object 5 тип_донации 249741 non-null object 6 город 249741 non-null object 7 регион 249741 non-null object 8 страна 249741 non-null object 9 место_сдачи 249741 non-null object 10 есть_справка 249741 non-null object 11 дата_добавления_донации 249741 non-null object 12 статус_донации 249741 non-null object dtypes: datetime64[ns](1), int64(2), object(10) memory usage: 24.8+ MB
Число строк до обработки
a = len(df_d)
a
249741
get_date_range_info(df_d,'дата_донации')
'Данные представлены за период от 1900-01-01 00:00:00 до 2092-06-10 00:00:00, разница в 70288 days 00:00:00.'
Видно,что 7 записей с датами ушли в NaN. И явно есть записи с ошибками в годах.
df_d[df_d['дата_донации'].isnull()]
| id | id_пользователя | класс_крови | дата_донации | дата_планирования | тип_донации | город | регион | страна | место_сдачи | есть_справка | дата_добавления_донации | статус_донации | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 139923 | 114280 | 126057 | Цельная кровь | NaT | Не указана | Безвозмездно | Челябинск | Челябинская область | Россия | ГБУЗ "Челябинская областная станция переливани... | Да | 14.04.2022 | Принята |
| 167017 | 86247 | 147222 | Плазма | NaT | Не указана | Безвозмездно | Санкт-Петербург | Не указан | Россия | Военно-медицинская академия им. С.М. Кирова, о... | Да | 18.11.2020 | Принята |
| 187207 | 65020 | 8071 | Цельная кровь | NaT | Не указана | Безвозмездно | Санкт-Петербург | Не указан | Россия | Городская станция переливания крови Санкт-Пете... | Да | 18.11.2020 | Удалена |
| 191435 | 60529 | 119710 | Цельная кровь | NaT | Не указана | Безвозмездно | Не указан | Не указан | Не указан | Выездная акция | Да | 18.11.2020 | Принята |
| 191726 | 60210 | 131932 | Тромбоциты | NaT | Не указана | Платно | Москва | Не указан | Россия | Центр крови им. Гаврилова (центр на Беговой) | Да | 18.11.2020 | Принята |
| 192661 | 59242 | 139934 | Плазма | NaT | Не указана | Безвозмездно | Елец | Липецкая область | Россия | МУЗ "Елецкая городская станция переливания кро... | Да | 18.11.2020 | Принята |
| 233277 | 17012 | 136722 | Цельная кровь | NaT | Не указана | Безвозмездно | Не указан | Не указан | Не указан | Выездная акция | Да | 18.11.2020 | Без справки |
Таких даееых немного, можно удалить эти строки.Посмотрим на года в датах.
df_d['год'] = df_d['дата_донации'].dt.year
df_d['год'].value_counts()
2022.0 35574 2023.0 30169 2021.0 21972 2015.0 19865 2016.0 19127 2018.0 18724 2019.0 16712 2017.0 16471 2020.0 16415 2014.0 16187 2013.0 9366 2012.0 6667 2011.0 5289 2010.0 4559 2009.0 3240 2008.0 2026 2006.0 1435 2007.0 1073 2004.0 938 2005.0 841 2003.0 622 2002.0 529 1997.0 328 1999.0 290 2000.0 281 2001.0 269 1995.0 201 1996.0 165 1998.0 115 1994.0 43 1975.0 39 1992.0 24 1993.0 23 1990.0 20 1991.0 18 1984.0 14 1988.0 14 1989.0 13 1970.0 12 1982.0 9 1987.0 9 1983.0 8 1981.0 8 1985.0 6 1980.0 5 2085.0 4 1986.0 4 2092.0 3 1938.0 1 2055.0 1 2089.0 1 1900.0 1 1976.0 1 1920.0 1 1919.0 1 2056.0 1 Name: год, dtype: int64
Видно, что есть данные с записью года 1900,1919,1920,1938,2073,2089,2092
df_d[(df_d['год'] < 1970) | (df_d['год'] > 2023)]
| id | id_пользователя | класс_крови | дата_донации | дата_планирования | тип_донации | город | регион | страна | место_сдачи | есть_справка | дата_добавления_донации | статус_донации | год | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | 258750 | 271511 | Цельная кровь | 2085-08-07 | Не указана | Безвозмездно | Воронеж | Воронежская область | Россия | БУЗ ВО "Воронежская областная станция перелива... | Да | 28.11.2023 | На модерации | 2085.0 |
| 4 | 258748 | 271511 | Тромбоциты | 2056-09-12 | Не указана | Безвозмездно | Воронеж | Воронежская область | Россия | БУЗ ВО "Воронежская областная станция перелива... | Да | 28.11.2023 | Удалена | 2056.0 |
| 5 | 258747 | 271511 | Тромбоциты | 2055-11-30 | Не указана | Безвозмездно | Воронеж | Воронежская область | Россия | БУЗ ВО "Воронежская областная станция перелива... | Да | 28.11.2023 | Удалена | 2055.0 |
| 130 | 258624 | 271511 | Цельная кровь | 2085-08-07 | Не указана | Безвозмездно | Воронеж | Воронежская область | Россия | БУЗ ВО "Воронежская областная станция перелива... | Да | 27.11.2023 | Удалена | 2085.0 |
| 2446 | 256142 | 275398 | Цельная кровь | 2089-05-06 | Не указана | Безвозмездно | Кемерово | Кемеровская область | Россия | ГКУЗ "Кузбасский центр крови" (Кемеровский об... | Да | 19.11.2023 | Удалена | 2089.0 |
| 3806 | 254763 | 161252 | Тромбоциты | 2085-08-07 | Не указана | Безвозмездно | Подольск | Московская область | Россия | ГУЗ МО "Подольская станция переливания крови" | Да | 14.11.2023 | Удалена | 2085.0 |
| 4786 | 253750 | 228133 | Тромбоциты | 2085-08-26 | 08.01.2024 | Безвозмездно | Уфа | Башкортостан | Россия | ГБУЗ "Республиканская станция переливания крови" | Да | 09.11.2023 | Удалена | 2085.0 |
| 6209 | 251460 | 262599 | Тромбоциты | 2092-06-10 | Не указана | Безвозмездно | Ульяновск | Ульяновская область | Россия | ГУЗ "Ульяновская областная станция переливания... | Да | 02.11.2023 | Удалена | 2092.0 |
| 6282 | 251386 | 262599 | Тромбоциты | 2092-06-10 | Не указана | Безвозмездно | Ульяновск | Ульяновская область | Россия | ГУЗ "Ульяновская областная станция переливания... | Да | 02.11.2023 | Удалена | 2092.0 |
| 6285 | 251383 | 262599 | Тромбоциты | 2092-06-10 | Не указана | Безвозмездно | Ульяновск | Ульяновская область | Россия | ГУЗ "Ульяновская областная станция переливания... | Да | 02.11.2023 | Удалена | 2092.0 |
| 27363 | 229718 | 264550 | Цельная кровь | 1900-01-01 | Не указана | Безвозмездно | Новокузнецк | Кемеровская область | Россия | (Ликвидирован) МУЗ "ГБ №29" | Нет | 28.07.2023 | Удалена | 1900.0 |
| 27364 | 229717 | 264550 | Цельная кровь | 1938-07-22 | Не указана | Безвозмездно | Новокузнецк | Кемеровская область | Россия | Новокузнецкий филиал ГКУЗ "КЦК" | Нет | 28.07.2023 | Удалена | 1938.0 |
| 161853 | 91878 | 1630 | Плазма | 1920-04-29 | Не указана | Безвозмездно | Симферополь | Крым | Россия | ГБУЗ Республики Крым «Центр крови» | Да | 18.11.2020 | Удалена | 1920.0 |
| 161854 | 91877 | 1630 | Плазма | 1919-09-24 | Не указана | Безвозмездно | Симферополь | Крым | Россия | ГБУЗ Республики Крым «Центр крови» | Да | 18.11.2020 | Удалена | 1919.0 |
Таких записей всего 14, также удалим их.Ограничим период с 1970 по 2023.Хотя у нас в приоритете анализ 2023-2022 годов, оставим эти данные для возможности статистического анализа за больший период.Отфильтровать по году всегда можно.
df_d = df_d.drop(df_d[(df_d['год'] < 1970) | (df_d['год'] > 2023)].index)
df_d = df_d.dropna(subset=['год'])
Посмотрим на полные дубликаты
df_d[df_d.duplicated()].head(10)
| id | id_пользователя | класс_крови | дата_донации | дата_планирования | тип_донации | город | регион | страна | место_сдачи | есть_справка | дата_добавления_донации | статус_донации | год | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 226 | 258529 | 50531 | Плазма | 2023-11-27 | 09.11.2023 | Безвозмездно | Казань | Татарстан | Россия | Казанский плазмоцентр ФГБУ РМНПЦ «Росплазма» Ф... | Да | 27.11.2023 | Принята | 2023.0 |
| 335 | 258425 | 264138 | Цельная кровь | 2023-11-27 | 27.11.2023 | Безвозмездно | Махачкала | Дагестан | Россия | ГБУ Республики Дагестан "Республиканская станц... | Да | 27.11.2023 | Принята | 2023.0 |
| 665 | 258000 | 275375 | Цельная кровь | 2023-11-25 | 25.11.2023 | Безвозмездно | Москва | Не указан | Россия | ГБУЗ "ГКБ № 52", отделение переливания крови | Да | 25.11.2023 | Принята | 2023.0 |
| 948 | 257715 | 178832 | Тромбоциты | 2023-11-24 | 24.11.2023 | Безвозмездно | Москва | Не указан | Россия | ФГБУ «НМИЦ ДГОИ им. Дмитрия Рогачева» Минздрав... | Да | 24.11.2023 | Принята | 2023.0 |
| 2849 | 255739 | 261466 | Цельная кровь | 2023-11-16 | 16.11.2023 | Безвозмездно | Санкт-Петербург | Не указан | Россия | (Ликвидирован, переехал на ул. Л.Толстого, 19,... | Нет | 18.11.2023 | Без справки | 2023.0 |
| 2853 | 255738 | 265316 | Цельная кровь | 2023-11-17 | 20.10.2023 | Безвозмездно | Тула | Тульская область | Россия | ГУЗ "Тульская областная станция переливания кр... | Да | 18.11.2023 | Принята | 2023.0 |
| 2974 | 255585 | 224276 | Цельная кровь | 2023-11-15 | 15.11.2023 | Безвозмездно | Выкса | Нижегородская область | Россия | Выездная акция | Да | 17.11.2023 | Принята | 2023.0 |
| 2975 | 255585 | 224276 | Цельная кровь | 2023-11-15 | 15.11.2023 | Безвозмездно | Выкса | Нижегородская область | Россия | Выездная акция | Да | 17.11.2023 | Принята | 2023.0 |
| 2976 | 255585 | 224276 | Цельная кровь | 2023-11-15 | 15.11.2023 | Безвозмездно | Выкса | Нижегородская область | Россия | Выездная акция | Да | 17.11.2023 | Принята | 2023.0 |
| 2977 | 255585 | 224276 | Цельная кровь | 2023-11-15 | 15.11.2023 | Безвозмездно | Выкса | Нижегородская область | Россия | Выездная акция | Да | 17.11.2023 | Принята | 2023.0 |
Действительно, есть записи полностью повторяющиеся.Это проблема сбора или внесения данных?
df_d = df_d.drop_duplicates ()
Посмотрим на число уникальных значений по столбцам
df_d.nunique ()
id 247205 id_пользователя 46158 класс_крови 5 дата_донации 7514 дата_планирования 1052 тип_донации 2 город 797 регион 126 страна 13 место_сдачи 809 есть_справка 2 дата_добавления_донации 1105 статус_донации 5 год 47 dtype: int64
df_d.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 249083 entries, 0 to 249740 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 249083 non-null int64 1 id_пользователя 249083 non-null int64 2 класс_крови 249083 non-null object 3 дата_донации 249083 non-null datetime64[ns] 4 дата_планирования 249083 non-null object 5 тип_донации 249083 non-null object 6 город 249083 non-null object 7 регион 249083 non-null object 8 страна 249083 non-null object 9 место_сдачи 249083 non-null object 10 есть_справка 249083 non-null object 11 дата_добавления_донации 249083 non-null object 12 статус_донации 249083 non-null object 13 год 249083 non-null float64 dtypes: datetime64[ns](1), float64(1), int64(2), object(10) memory usage: 28.5+ MB
df_d.id.nunique()
247205
Однако число уникальных id записей меньше числа строк в датасете
df_d[df_d['id'].duplicated()].head(10)
| id | id_пользователя | класс_крови | дата_донации | дата_планирования | тип_донации | город | регион | страна | место_сдачи | есть_справка | дата_добавления_донации | статус_донации | год | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 110 | 258642 | 241336 | Цельная кровь | 2023-11-28 | 23.06.2023 | Безвозмездно | Благовещенск | Амурская область | Россия | Выездная акция | Да | 28.11.2023 | Принята | 2023.0 |
| 111 | 258642 | 241336 | Цельная кровь | 2023-11-28 | 13.06.2023 | Безвозмездно | Благовещенск | Амурская область | Россия | Выездная акция | Да | 28.11.2023 | Принята | 2023.0 |
| 117 | 258637 | 232312 | Плазма | 2023-11-27 | 27.11.2023 | Безвозмездно | Севастополь | Крым | Россия | ГБУЗ Севастополя "Центр Крови" | Да | 27.11.2023 | Принята | 2023.0 |
| 212 | 258542 | 194135 | Цельная кровь | 2023-11-27 | 20.11.2023 | Безвозмездно | Санкт-Петербург | Не указан | Россия | СПб ГБУЗ «Городская больница Святого Великомуч... | Да | 27.11.2023 | Принята | 2023.0 |
| 331 | 258425 | 264138 | Цельная кровь | 2023-11-27 | 27.11.2023 | Безвозмездно | Махачкала | Дагестан | Россия | ГБУ Республики Дагестан "Республиканская станц... | Да | 27.11.2023 | Принята | 2023.0 |
| 332 | 258425 | 264138 | Цельная кровь | 2023-11-27 | 01.08.2023 | Безвозмездно | Махачкала | Дагестан | Россия | ГБУ Республики Дагестан "Республиканская станц... | Да | 27.11.2023 | Принята | 2023.0 |
| 333 | 258425 | 264138 | Цельная кровь | 2023-11-27 | 24.07.2023 | Безвозмездно | Махачкала | Дагестан | Россия | ГБУ Республики Дагестан "Республиканская станц... | Да | 27.11.2023 | Принята | 2023.0 |
| 334 | 258425 | 264138 | Цельная кровь | 2023-11-27 | 06.11.2023 | Безвозмездно | Махачкала | Дагестан | Россия | ГБУ Республики Дагестан "Республиканская станц... | Да | 27.11.2023 | Принята | 2023.0 |
| 348 | 258413 | 236731 | Цельная кровь | 2023-11-27 | 27.11.2023 | Безвозмездно | Санкт-Петербург | Не указан | Россия | СПб ГБУЗ «Городская Мариинская больница», опк | Да | 27.11.2023 | Принята | 2023.0 |
| 648 | 258014 | 163651 | Цельная кровь | 2023-11-22 | 20.11.2023 | Безвозмездно | Краснодар | Краснодарский край | Россия | ГБУЗ "Станция переливания крови" МЗ Краснодарс... | Да | 25.11.2023 | Принята | 2023.0 |
df_d = df_d.drop_duplicates ('id')
Удалим дубликаты по 'id'
df_d.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 247205 entries, 0 to 249740 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 247205 non-null int64 1 id_пользователя 247205 non-null int64 2 класс_крови 247205 non-null object 3 дата_донации 247205 non-null datetime64[ns] 4 дата_планирования 247205 non-null object 5 тип_донации 247205 non-null object 6 город 247205 non-null object 7 регион 247205 non-null object 8 страна 247205 non-null object 9 место_сдачи 247205 non-null object 10 есть_справка 247205 non-null object 11 дата_добавления_донации 247205 non-null object 12 статус_донации 247205 non-null object 13 год 247205 non-null float64 dtypes: datetime64[ns](1), float64(1), int64(2), object(10) memory usage: 28.3+ MB
Приведем другие даты в форма дат
df_d['дата_планирования'] = pd.to_datetime(df_d['дата_планирования'], format='%d.%m.%Y', errors='coerce')
df_d['дата_добавления_донации'] = pd.to_datetime(df_d['дата_добавления_донации'], format='%d.%m.%Y', errors='coerce')
(df_d['дата_планирования'].dt.year).value_counts(dropna=False)
NaN 236854 2023.0 4811 2022.0 3889 2021.0 1560 2020.0 91 Name: дата_планирования, dtype: int64
Подавляющее большинство дат ушли в NaN. Что и понятно: эти данные собирались только с 2020 года
(df_d['дата_добавления_донации'].dt.year).value_counts(dropna=False)
2020 89415 2023 81197 2022 64092 2021 12501 Name: дата_добавления_донации, dtype: int64
df_d['класс_крови'].value_counts(dropna=False)
Цельная кровь 162780 Плазма 58785 Тромбоциты 25105 Эритроциты 447 Гранулоциты (Лейкоциты) 88 Name: класс_крови, dtype: int64
df_d['статус_донации'].value_counts(dropna=False)
Принята 222872 Без справки 17460 Удалена 5486 Отклонена 1289 На модерации 98 Name: статус_донации, dtype: int64
df_d['место_сдачи'].value_counts(dropna=False)
Выездная акция 14507
ФГБУ НМИЦ Гематологии, (бывш. ГНЦ) 10083
Казанский плазмоцентр ФГБУ РМНПЦ «Росплазма» ФМБА России 7073
ГБУЗ "Республиканская станция переливания крови" 6805
ГАУЗ «Республиканский центр крови Министерства здравоохранения РТ» 6495
...
(Ликвидирован) Зуевское отделение переливания крови КОГБУЗ «Кировский центр крови» 1
(Ликвидирован) МУЗ "Торбеевская ЦРБ" 1
Каргатская центральная районная больница, отделение переливания крови 1
(Ликвидирован) Слободское ОПК 1
ГУ «Специализированная медико - санитарная часть № 6» 1
Name: место_сдачи, Length: 809, dtype: int64
df_d['тип_донации'].value_counts(dropna=False)
Безвозмездно 229884 Платно 17321 Name: тип_донации, dtype: int64
df_d['есть_справка'].value_counts(dropna=False)
Да 231009 Нет 16196 Name: есть_справка, dtype: int64
df_d.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 247205 entries, 0 to 249740 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 247205 non-null int64 1 id_пользователя 247205 non-null int64 2 класс_крови 247205 non-null object 3 дата_донации 247205 non-null datetime64[ns] 4 дата_планирования 10351 non-null datetime64[ns] 5 тип_донации 247205 non-null object 6 город 247205 non-null object 7 регион 247205 non-null object 8 страна 247205 non-null object 9 место_сдачи 247205 non-null object 10 есть_справка 247205 non-null object 11 дата_добавления_донации 247205 non-null datetime64[ns] 12 статус_донации 247205 non-null object 13 год 247205 non-null float64 dtypes: datetime64[ns](3), float64(1), int64(2), object(8) memory usage: 28.3+ MB
число строк после предобработки
b = len(df_d)
b
247205
a
249741
print("Потери данных в %:",(a-b)/a*100)
Потери данных в %: 1.0154520082805787
Выводы:
-переименованы столбцы, удалены дубликаты, даты переведены в datetime
-можно проанализировать пользователей по дате донации(динамика),по компонентам крови,типу донации, городам, странам регионам и т.п
donations_plan 281123.csv- планы донаций¶Данные о запланированных донациях
ID- Уникальный идентификатор строки.
ID пользователя- Уникальный идентификатор донора.
Класс крови- Что именно - цельную кровь или компоненты и какие - планирует
сдать донор.
Дата донации- На какую дату запланирована донация / либо когда была
сделана донация.
Дата планирования- Дата занесения информации о планировании донации на
сайт.
Тип донации- Возможны только 2 значения: Платно и Безвозмездно.
Регион- Место, где планируется сделать донацию в формате: старана, регион,
город (возможны исключения в формате, например, для городов
федерального значения).
Место сдачи- В каком медицинском учреждении планируют сдать
донацию
Статус- Статус донации. Может принимать одно из четырех значений.
Есть справка- Прислал ли пользователь скан/фото справки о донации
#Загрузка датасета
df_p = pd.read_csv(patch + 'donations_plan 281123.csv',sep=",")
df_p = inform(df_p)
| ID | ID пользователя | Класс крови | Дата донации | Дата планирования | Тип донации | Регион | Место стадчи | Статус | Есть справка | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 28427 | 276176 | Цельная кровь | 29.11.2023 | 28.11.2023 | Безвозмездно | Россия, Москва | Выездная акция | донация запланирована | Нет |
| 1 | 28426 | 274739 | Цельная кровь | 24.01.2024 | 28.11.2023 | Безвозмездно | Россия, Москва | ОПК ГБУЗ МО «Московский областной научно-иссле... | донация запланирована | Нет |
| 2 | 28425 | 276151 | Тромбоциты | 01.12.2023 | 28.11.2023 | Безвозмездно | Россия, Москва | ФГБУ "НМИЦ хирургии им. А.В. Вишневского" МЗ Р... | донация запланирована | Нет |
| 3 | 28424 | 276173 | Цельная кровь | 29.11.2023 | 28.11.2023 | Безвозмездно | Россия, Москва | Выездная акция | донация запланирована | Нет |
| 4 | 28423 | 276172 | Цельная кровь | 29.11.2023 | 28.11.2023 | Безвозмездно | Россия, Москва | Выездная акция | донация запланирована | Нет |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 27720 entries, 0 to 27719 Data columns (total 10 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID 27720 non-null int64 1 ID пользователя 27720 non-null int64 2 Класс крови 27720 non-null object 3 Дата донации 27720 non-null object 4 Дата планирования 27720 non-null object 5 Тип донации 27720 non-null object 6 Регион 27720 non-null object 7 Место стадчи 27720 non-null object 8 Статус 27720 non-null object 9 Есть справка 27720 non-null object dtypes: int64(2), object(8) memory usage: 2.1+ MB Количество дубликатов - 0 Число пропусков - ID 0 ID пользователя 0 Класс крови 0 Дата донации 0 Дата планирования 0 Тип донации 0 Регион 0 Место стадчи 0 Статус 0 Есть справка 0 dtype: int64 Доля пропусков - ID 0.0 ID пользователя 0.0 Класс крови 0.0 Дата донации 0.0 Дата планирования 0.0 Тип донации 0.0 Регион 0.0 Место стадчи 0.0 Статус 0.0 Есть справка 0.0 dtype: float64
| ID | ID пользователя | |
|---|---|---|
| count | 27720.000000 | 27720.000000 |
| mean | 14221.196825 | 196972.017496 |
| std | 8196.089222 | 59523.983412 |
| min | 1.000000 | 14.000000 |
| 25% | 7122.750000 | 164946.750000 |
| 50% | 14251.500000 | 206559.000000 |
| 75% | 21323.250000 | 239392.750000 |
| max | 28427.000000 | 276176.000000 |
df_p.columns = df_p.columns.str.lower().str.replace(' ', '_')
df_p.columns
Index(['id', 'id_пользователя', 'класс_крови', 'дата_донации',
'дата_планирования', 'тип_донации', 'регион', 'место_стадчи', 'статус',
'есть_справка'],
dtype='object')
переименуем колонки с ошибкой и с датами согласно их сути
df_p =df_p.rename(columns = {'место_стадчи':'место_сдачи','дата_планирования':'дата_записи','дата_донации':'дата_план'})
df_p['дата_план'].value_counts(dropna=False)
20.04.2023 251
20.04.2022 241
14.06.2022 221
25.04.2023 173
19.10.2023 159
...
02.01.2021 1
01.01.2021 1
10.01.2021 1
30.07.2100 1
02.01.2024 1
Name: дата_план, Length: 1175, dtype: int64
df_p['дата_записи'].value_counts(dropna=False)
19.04.2023 154
13.04.2022 153
21.05.2023 128
18.04.2023 115
12.10.2023 110
...
07.01.2021 1
18.04.2021 1
17.12.2020 1
30.05.2021 1
10.01.2021 1
Name: дата_записи, Length: 1098, dtype: int64
df_p['дата_план'] = pd.to_datetime(df_p['дата_план'], format='%d.%m.%Y', errors='coerce')
df_p['дата_записи'] = pd.to_datetime(df_p['дата_записи'], format='%d.%m.%Y', errors='coerce')
(df_p['дата_записи'].dt.year).value_counts(dropna=False)
2023 12570 2022 10889 2021 4009 2020 252 Name: дата_записи, dtype: int64
(df_p['дата_план'].dt.year).value_counts(dropna=False)
2023 12931 2022 10598 2021 3857 2024 180 2020 150 2100 2 2030 1 2099 1 Name: дата_план, dtype: int64
df_p['год'] = df_p['дата_план'].dt.year
df_p.query('год== 2024')
| id | id_пользователя | класс_крови | дата_план | дата_записи | тип_донации | регион | место_сдачи | статус | есть_справка | год | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 28426 | 274739 | Цельная кровь | 2024-01-24 | 2023-11-28 | Безвозмездно | Россия, Москва | ОПК ГБУЗ МО «Московский областной научно-иссле... | донация запланирована | Нет | 2024 |
| 12 | 28415 | 276161 | Цельная кровь | 2024-01-29 | 2023-11-28 | Безвозмездно | Россия, Хабаровский край, Хабаровск | КГБУЗ "Краевая станция переливания крови МЗ Ха... | донация запланирована | Нет | 2024 |
| 16 | 28411 | 151510 | Цельная кровь | 2024-02-01 | 2023-11-28 | Безвозмездно | Россия, Волгоградская область, Волгоград | МУЗ «Городская клиническая больница скорой мед... | донация запланирована | Нет | 2024 |
| 17 | 28410 | 221531 | Цельная кровь | 2024-02-01 | 2023-11-28 | Безвозмездно | Россия, Санкт-Петербург | Военно-медицинская академия им. С.М. Кирова, о... | донация запланирована | Нет | 2024 |
| 33 | 28393 | 194135 | Цельная кровь | 2024-01-29 | 2023-11-27 | Безвозмездно | Россия, Санкт-Петербург | СПб ГБУЗ «Городская больница Святого Великомуч... | донация запланирована | Нет | 2024 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 4868 | 23403 | 215913 | Цельная кровь | 2024-01-25 | 2023-07-18 | Безвозмездно | Россия, Волгоградская область, Урюпинск | ГУЗ «Волгоградская областная станция переливан... | донация запланирована | Нет | 2024 |
| 5819 | 22442 | 12880 | Цельная кровь | 2024-02-14 | 2023-06-15 | Безвозмездно | Россия, Еврейская АОбл, Биробиджан | ОГУЗ "Станция переливания крови Еврейской авто... | донация запланирована | Нет | 2024 |
| 7647 | 20598 | 154879 | Цельная кровь | 2024-03-25 | 2023-04-25 | Безвозмездно | Россия, Московская область, Жуковский | Городская Клиническая Больница г. Жуковский, о... | донация запланирована | Нет | 2024 |
| 7884 | 20355 | 229261 | Цельная кровь | 2024-01-04 | 2023-04-20 | Безвозмездно | Россия, Ханты-Мансийский Автономный округ - Юг... | КУ ХМАО - Югры "Станция переливания крови", фи... | донация запланирована | Нет | 2024 |
| 18441 | 9521 | 42551 | Цельная кровь | 2024-01-15 | 2022-07-23 | Безвозмездно | Россия, Краснодарский край, Краснодар | ГБУЗ "Станция переливания крови" МЗ Краснодарс... | донация запланирована | Нет | 2024 |
180 rows × 11 columns
(df_p.query('год== 2024')).есть_справка.value_counts()
Нет 179 Да 1 Name: есть_справка, dtype: int64
df_p.id.nunique()
27720
Ошибка или заменить на планируемую дату?
feedback_anon 281123.csv- Оценки от пользователей станциям переливания крови¶ID- пользователя Уникальный идентификатор донора.
Место сдачи- В каком медицинском учреждении была сделана донация.
Дата донации- Дата донации.
Оценка- Оценка от пользователя станции переливания крови
#Загрузка датасета
df_f = pd.read_csv(patch + 'feedback_anon 281123.csv')
df_f = inform(df_f)
| ID пользователя | Место сдачи | Дата донации | Оценка | ID донации | |
|---|---|---|---|---|---|
| 0 | 176988 | Центр крови им. Гаврилова (центр в Царицыно) | 28.11.2023 | 4 | 258713 |
| 1 | 259025 | Не указано | 28.11.2023 | 5 | 258712 |
| 2 | 276161 | КГБУЗ "Краевая станция переливания крови МЗ Ха... | 27.11.2023 | 4 | 258705 |
| 3 | 151510 | МУЗ «Городская клиническая больница скорой мед... | 28.11.2023 | 5 | 258665 |
| 4 | 221531 | Военно-медицинская академия им. С.М. Кирова, о... | 28.11.2023 | 5 | 258661 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 16795 entries, 0 to 16794 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID пользователя 16795 non-null int64 1 Место сдачи 16795 non-null object 2 Дата донации 16795 non-null object 3 Оценка 16795 non-null int64 4 ID донации 16795 non-null int64 dtypes: int64(3), object(2) memory usage: 656.2+ KB Количество дубликатов - 188 Число пропусков - ID пользователя 0 Место сдачи 0 Дата донации 0 Оценка 0 ID донации 0 dtype: int64 Доля пропусков - ID пользователя 0.0 Место сдачи 0.0 Дата донации 0.0 Оценка 0.0 ID донации 0.0 dtype: float64
| ID пользователя | Оценка | ID донации | |
|---|---|---|---|
| count | 16795.000000 | 16795.000000 | 16795.000000 |
| mean | 181978.478773 | 4.709973 | 163439.006966 |
| std | 68177.232778 | 0.624052 | 51510.907069 |
| min | 11.000000 | 1.000000 | 402.000000 |
| 25% | 151611.000000 | 5.000000 | 114005.500000 |
| 50% | 195836.000000 | 5.000000 | 158948.000000 |
| 75% | 232761.000000 | 5.000000 | 209787.500000 |
| max | 276161.000000 | 5.000000 | 258713.000000 |
df_f.columns = df_f.columns.str.lower().str.replace(' ', '_')
df_f.columns
Index(['id_пользователя', 'место_сдачи', 'дата_донации', 'оценка',
'id_донации'],
dtype='object')
df_f['дата_донации'] = pd.to_datetime(df_f['дата_донации'], format='%d.%m.%Y', errors='coerce')
(df_f['дата_донации'].dt.year).value_counts()
2022.0 5330 2023.0 4820 2021.0 3042 2020.0 1076 2019.0 572 2018.0 391 2017.0 340 2016.0 236 2015.0 208 2014.0 191 2013.0 135 2012.0 109 2011.0 79 2010.0 60 2009.0 29 2006.0 25 2005.0 21 2007.0 19 2004.0 16 2000.0 14 2008.0 12 2001.0 7 2002.0 7 2003.0 7 1998.0 7 1999.0 6 1996.0 6 1993.0 5 1997.0 5 1994.0 5 1995.0 4 1992.0 4 1988.0 2 1991.0 2 1989.0 2 Name: дата_донации, dtype: int64
df_f[df_f.duplicated()].head(10)
| id_пользователя | место_сдачи | дата_донации | оценка | id_донации | |
|---|---|---|---|---|---|
| 59 | 275871 | ГБУЗ Тюменской области "Областная станция пере... | 2023-09-07 | 5 | 257623 |
| 61 | 275871 | ГБУЗ Тюменской области "Областная станция пере... | 2023-10-05 | 5 | 257622 |
| 62 | 275871 | ГБУЗ Тюменской области "Областная станция пере... | 2023-10-05 | 5 | 257622 |
| 63 | 275871 | ГБУЗ Тюменской области "Областная станция пере... | 2023-10-05 | 5 | 257622 |
| 140 | 220454 | Городская станция переливания крови Санкт-Пете... | 2023-11-20 | 5 | 256464 |
| 287 | 226199 | Пятигорский филиал ГБУЗ СК "Ставропольская кра... | 2023-11-10 | 5 | 254241 |
| 531 | 245447 | Городская станция переливания крови Санкт-Пете... | 2020-10-06 | 5 | 250057 |
| 533 | 245447 | Городская станция переливания крови Санкт-Пете... | 2020-12-14 | 5 | 250056 |
| 920 | 272192 | ГБУЗ "Челябинская областная станция переливани... | 2023-10-08 | 4 | 246939 |
| 1316 | 224438 | Ачинский филиал Красноярского краевого центра ... | 2023-09-28 | 5 | 243043 |
Здесь явно есть полные дубликаты, но опять же неясна их природа.Я бы удалила.
df_f.drop_duplicates()
| id_пользователя | место_сдачи | дата_донации | оценка | id_донации | |
|---|---|---|---|---|---|
| 0 | 176988 | Центр крови им. Гаврилова (центр в Царицыно) | 2023-11-28 | 4 | 258713 |
| 1 | 259025 | Не указано | 2023-11-28 | 5 | 258712 |
| 2 | 276161 | КГБУЗ "Краевая станция переливания крови МЗ Ха... | 2023-11-27 | 4 | 258705 |
| 3 | 151510 | МУЗ «Городская клиническая больница скорой мед... | 2023-11-28 | 5 | 258665 |
| 4 | 221531 | Военно-медицинская академия им. С.М. Кирова, о... | 2023-11-28 | 5 | 258661 |
| ... | ... | ... | ... | ... | ... |
| 16790 | 3121 | ГБУЗ "ГКБ № 52", отделение переливания крови | 2019-10-18 | 5 | 91990 |
| 16791 | 3297 | ГАУЗ «Республиканский центр крови Министерства... | 2020-11-19 | 5 | 91979 |
| 16792 | 152781 | ГБУЗ СК "Ставропольская краевая станция перели... | 2020-11-18 | 5 | 91976 |
| 16793 | 139242 | ФГБУ НМИЦ Гематологии, (бывш. ГНЦ) | 2020-11-09 | 5 | 91975 |
| 16794 | 829 | ОПК ГКБ им. В.М. Буянова ДЗМ, отделение перели... | 2020-11-19 | 4 | 91968 |
16607 rows × 5 columns
df_f['дата_донации'] = pd.to_datetime(df_f['дата_донации'], format='%Y.%m.%d', errors='coerce')
get_date_range_info(df_f,'дата_донации')
'Данные представлены за период от 1988-05-03 00:00:00 до 2023-11-28 00:00:00, разница в 12992 days 00:00:00.'
df_f['дата_донации']
0 2023-11-28
1 2023-11-28
2 2023-11-27
3 2023-11-28
4 2023-11-28
...
16790 2019-10-18
16791 2020-11-19
16792 2020-11-18
16793 2020-11-09
16794 2020-11-19
Name: дата_донации, Length: 16795, dtype: datetime64[ns]
df_f.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 16795 entries, 0 to 16794 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id_пользователя 16795 non-null int64 1 место_сдачи 16795 non-null object 2 дата_донации 16794 non-null datetime64[ns] 3 оценка 16795 non-null int64 4 id_донации 16795 non-null int64 dtypes: datetime64[ns](1), int64(3), object(1) memory usage: 656.2+ KB
1 запись по дате ушла в NaN
df_f=df_f.dropna(subset=['дата_донации'])
df_f.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 16794 entries, 0 to 16794 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id_пользователя 16794 non-null int64 1 место_сдачи 16794 non-null object 2 дата_донации 16794 non-null datetime64[ns] 3 оценка 16794 non-null int64 4 id_донации 16794 non-null int64 dtypes: datetime64[ns](1), int64(3), object(1) memory usage: 787.2+ KB
Сдесь можно смртреть на средние оценки применительно к центрам сдачи и их динамику пр годам. Можно было бы связать с 1 таблицей , но нет связи по id центра сдачи крови.
stat_uni_20231128151236_92977.csv- файл 1 рассылок¶#Загрузка датасета
df_st = pd.read_csv(patch + 'stat_uni_20231128151236_92977.csv')
df_st = inform(df_st)
| Дата | Название выпуска | Получатели | Отправлено | Доставлено % | OR % | CTR % | Ошибки % | Отписки % | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 2023-11-28 14:10:23 | P_Запрос пожертвований на лояльных 28.11.2023 | Лояльные | 1347 | 68.89 | 29.63 | 2.90 | 0.00 | 0.32 |
| 1 | 2023-11-15 11:49:20 | Значки отправлены 29 | на отправку 29 | 49 | 100.00 | 85.71 | 32.65 | 0.00 | 0.00 |
| 2 | 2023-11-09 10:59:26 | Значки отзывы 28 | на отправку 28 | 56 | 100.00 | 57.14 | 17.85 | 0.00 | 0.00 |
| 3 | 2023-11-02 18:21:29 | «Мы помогаем каждому найти в себе донора»_02/1... | 2 ноября ДР DonorSearch | 125597 | 99.13 | 9.14 | 0.48 | 0.87 | 0.41 |
| 4 | 2023-10-26 13:53:06 | Значки отправлены 28 | на отправку 28 | 56 | 100.00 | 76.78 | 26.78 | 0.00 | 0.00 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 155 entries, 0 to 154 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Дата 155 non-null object 1 Название выпуска 155 non-null object 2 Получатели 155 non-null object 3 Отправлено 155 non-null int64 4 Доставлено % 155 non-null float64 5 OR % 151 non-null float64 6 CTR % 151 non-null float64 7 Ошибки % 155 non-null float64 8 Отписки % 151 non-null float64 dtypes: float64(5), int64(1), object(3) memory usage: 11.0+ KB Количество дубликатов - 0 Число пропусков - Дата 0 Название выпуска 0 Получатели 0 Отправлено 0 Доставлено % 0 OR % 4 CTR % 4 Ошибки % 0 Отписки % 4 dtype: int64 Доля пропусков - Дата 0.000000 Название выпуска 0.000000 Получатели 0.000000 Отправлено 0.000000 Доставлено % 0.000000 OR % 0.025806 CTR % 0.025806 Ошибки % 0.000000 Отписки % 0.025806 dtype: float64
| Отправлено | Доставлено % | OR % | CTR % | Ошибки % | Отписки % | |
|---|---|---|---|---|---|---|
| count | 155.000000 | 155.000000 | 151.000000 | 151.000000 | 155.000000 | 151.000000 |
| mean | 25491.954839 | 95.771032 | 44.783311 | 17.188411 | 1.436645 | 0.390000 |
| std | 38061.066656 | 15.995524 | 28.389661 | 17.457355 | 2.391156 | 0.567593 |
| min | 1.000000 | 0.000000 | 7.100000 | 0.250000 | 0.000000 | 0.000000 |
| 25% | 49.000000 | 98.000000 | 15.905000 | 2.290000 | 0.000000 | 0.000000 |
| 50% | 401.000000 | 98.890000 | 42.220000 | 8.850000 | 0.790000 | 0.300000 |
| 75% | 55362.000000 | 100.000000 | 72.170000 | 31.950000 | 1.795000 | 0.580000 |
| max | 125682.000000 | 100.000000 | 100.000000 | 100.000000 | 20.000000 | 3.440000 |
df_st.columns = df_st.columns.str.lower().str.replace(' ', '_')
df_st.columns
Index(['дата', 'название_выпуска', 'получатели', 'отправлено', 'доставлено_%',
'or_%', 'ctr_%', 'ошибки_%', 'отписки_%'],
dtype='object')
df_st['дата'] = pd.to_datetime(df_st['дата'], errors='coerce')
get_date_range_info(df_st, 'дата')
'Данные представлены за период от 2018-06-27 12:32:53 до 2023-11-28 14:10:23, разница в 1980 days 01:37:30.'
df_st.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 155 entries, 0 to 154 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 дата 155 non-null datetime64[ns] 1 название_выпуска 155 non-null object 2 получатели 155 non-null object 3 отправлено 155 non-null int64 4 доставлено_% 155 non-null float64 5 or_% 151 non-null float64 6 ctr_% 151 non-null float64 7 ошибки_% 155 non-null float64 8 отписки_% 151 non-null float64 dtypes: datetime64[ns](1), float64(5), int64(1), object(2) memory usage: 11.0+ KB
df_st.название_выпуска.unique()
array(['P_Запрос пожертвований на лояльных 28.11.2023',
'Значки отправлены 29', 'Значки отзывы 28',
'«Мы помогаем каждому найти в себе донора»_02/11|23',
'Значки отправлены 28',
'2 «Мы помогаем каждому найти в себе донора» 25.10.2023, 16:32',
'Мы помогаем каждому найти в себе донора', 'Значки отзывы 27',
'«А теперь я, как ты!» ver.1 - больше 10 донаций (без значка)',
'«А теперь я, как ты!» ver.1 - есть значок',
'«А теперь я, как ты!» ver.1 - сегмент лейки (если нет в других списках) до 1.10.23',
'«А теперь я, как ты!» ver.1 - от 1 до 9 донаций',
'«А теперь я, как ты!» ver.1 - 2023',
'«А теперь я, как ты!» ver.1 - 2022',
'«А теперь я, как ты!» ver.1 - 2021', 'Значки отзывы города 6',
'Значки отправлены 27', 'Сентябрь отчет', 'Значки отзывы 26',
'Значки ждут в центре крови 1', 'Значки отправлены 26',
'Нет донаций 07.09.2023', 'Значки отзывы 25',
'Значки отправлены 25', 'Значки отзывы 24',
'Нет донаций 02.08.2023', 'Значки отзывы города 5',
'Значки отправлены 24', 'Значки отзывы 23',
'Нужны доноры, Казань июль', 'Значки отправлены 23',
'Значки отзывы 22', 'Нет донаций 18.06.2023',
'всемирный день донора 2023', 'Значки отправлены 22', 'Июнь инфо',
'Значки отзывы 21', 'Марафон май финал', 'Значки отправлены 21',
'Значки отзывы города 4', 'Значки отзывы 20',
'Значки отправлены 20', 'Значки отзывы 19', 'День донора_все',
'Донатеры 20 апреля 2023', 'Значки отправлены 19',
'Нет донаций 12.04.2023', 'Новый выпуск 10.04.2023, 19:40:24',
'Значки отзывы 18', 'Значки отзывы города 3',
'Новый выпуск 04.04.2023, 13:47:26', 'Значки отправлены 18',
'Значки отзывы 17', 'Значки отправлены 17',
'Нет донаций 15.03.2023', 'Значки отзывы 16', 'Значки отзывы 15',
'марафон май', 'значки отправлены 16', 'значки отправлены 15',
'Значки отзывы Города 2', 'Значки отзывы 14', 'Flowwow',
'Нет донаций 6.02', 'значки отправлены 14', 'Значки отзывы 13',
'значки отзывы 12', 'значки отзывы 11', 'значки отправлены 13',
'Новый выпуск 30.12.2022, 16:35:15', 'значки отправлены 12',
'Нет донаций', 'значки отправлены 11', 'значки отзывы хмао',
'значки отзывы 10', 'значки отзывы 9', 'значки отзывы 8',
'значки отзывы 7', 'значки отправлены 10', 'значки отправлены 9',
'рассылка ноября', 'значки отправлены_8', 'значки отзывы 6',
'значки отзывы 5', 'Значки отзывы 4', 'значки отправлены_7',
'день рождения проекта 2022', 'значки отправлены_6',
'Значки отзывы 1-3', 'Рассылка октября', 'значки отправлены_5',
'Не верифицированы_2', 'значки отправлены_4',
'Значки отправлены_3', 'Значки отправлены_2', 'Значки_сегмент 20+',
'Значки_нет донаций 1',
'Создано из «Значки_старт заказов» 09.09.2022, 16:18',
'Марафон_октябрь', 'Значки_старт заказов', 'СПБ_нужны доноры',
'Поддержите нас', 'Бонусы июля',
'Спецпроект Тест кто ты 14.06.2022, 12:48',
'Анонс мероприятий к 14 июня Казань', 'марафон детали',
'яндекс бонус', 'марафон',
'Создано из «20 апреля» 20.04.2022, 13:03', '20 апреля',
'ТОПЫ 12.04.2022, 15:07', 'Мы в других соцсетях', 'Бонусы гетт',
'День Рождения проекта 04.11.2021', 'АСИ опрос 17.09.2021, 12:13',
'Рассылка опроса по мероприятиям', 'день донора',
'Конкурс «КиноПоиск HD»', '«11 апреля ВДНХ КиноПоиск»',
'Создано из «Спецпроект 20 апреля» 19.04.2021, 22:17',
'анонс конкурса все майки 24.01', 'итоги 2020 30.12.2020, 16:36',
'День Рождения проекта 02.11.2020, 19:42',
'Приглашение BETA пользователей на Newdonorsearch и в беседу телеграм 23.10.2020, 17:29',
'Оповещение BETA пользователей',
'Чат-бот о донорстве костного мозга 12.10.2020, 10:36',
'Такси для доноров 15.04.2020', 'C наступающим Новым годом',
'С любовью, твой реципиент', 'Донор спас два миллиона детей',
'Большая помощь и комары',
'Интересные исследования о донорстве крови',
'Понедельник и центры крови', 'Путешествия и акции',
'День рождения DonorSearch!',
'День Рождения Руслана и история Алены Фирсовой',
'Создано из «Новый выпуск 12.10.2019 14:48:42» 19.10.2019 01:01',
'Новый выпуск 12.10.2019 14:48:42',
'Новый выпуск 21.09.2019 20:59:02',
'конкурс shop21 09.08.2019 11:40',
'Создано из «Конкурс Всемайки Февраль» 19.03.2019 13:24',
'«День донора ВКонтакте» 14.06.2019»',
'«Конкурс Всемайки май» 30.05.2019', 'Казань майские нехватка',
'Конкурс Всемайки Февраль',
'Создано из «Создано из «новый год» 26.12.18 10:21:30» 26.12.18 12:46:51',
'Создано из «новый год» 26.12.18 10:21:30',
'Halloween в центре крови🎃', 'Новый выпуск 24.07.18 12:51:47',
'iOS Android', 'Реанимация1 - Мы перазпустились',
'Создано из «Реанимация «Приветствие донорам DonorSearch.» 27.06.18 13:01:43» 27.06.18 13:56:19',
'Реанимация «Приветствие донорам DonorSearch.» 27.06.18 13:01:43',
'Создано из «Приветствие донорам DonorSearch.» 27.06.18 12:42:06',
'Приветствие донорам DonorSearch.'], dtype=object)
df_st['ошибки_%'].value_counts(dropna=False)
0.00 56
1.30 3
1.60 3
0.72 3
1.45 2
..
0.87 1
2.56 1
0.24 1
2.67 1
13.44 1
Name: ошибки_%, Length: 81, dtype: int64
df_st[df_st['ctr_%'].isnull()]
| дата | название_выпуска | получатели | отправлено | доставлено_% | or_% | ctr_% | ошибки_% | отписки_% | |
|---|---|---|---|---|---|---|---|---|---|
| 127 | 2019-12-23 16:02:15 | C наступающим Новым годом | Доступные для рассылки email | 53052 | 0.0 | NaN | NaN | 0.0 | NaN |
| 128 | 2019-12-16 16:02:12 | С любовью, твой реципиент | Доступные для рассылки email | 53296 | 0.0 | NaN | NaN | 0.0 | NaN |
| 129 | 2019-12-09 17:02:23 | Донор спас два миллиона детей | Доступные для рассылки email | 53580 | 0.0 | NaN | NaN | 0.0 | NaN |
| 130 | 2019-12-02 15:02:19 | Большая помощь и комары | Доступные для рассылки email | 53938 | 0.0 | NaN | NaN | 0.0 | NaN |
Видно, что это массовые поздравительные рассылки и по ним нет статистики.С точки зрения анализа не интересны.Удалим.
df_st=df_st.dropna(subset=['ctr_%'])
df_st.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 151 entries, 0 to 154 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 дата 151 non-null datetime64[ns] 1 название_выпуска 151 non-null object 2 получатели 151 non-null object 3 отправлено 151 non-null int64 4 доставлено_% 151 non-null float64 5 or_% 151 non-null float64 6 ctr_% 151 non-null float64 7 ошибки_% 151 non-null float64 8 отписки_% 151 non-null float64 dtypes: datetime64[ns](1), float64(5), int64(1), object(2) memory usage: 11.8+ KB
stat_uni_20231128151256_34555- файл 2 рассылок¶#Загрузка датасета
df_st1 = pd.read_csv(patch + 'stat_uni_20231128151256_34555.csv')
df_st1 = inform(df_st1)
| Дата | Название выпуска | Получатели | Отправлено | Доставлено % | OR % | CTR % | Ошибки % | Отписки % | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 2023-11-28 13:42:34 | P_Запрос пожертвований на лояльных 28.11.2023 | Транзакционные выпуски | 1 | 100.00 | 100.00 | 0.00 | 0.00 | 0.0 |
| 1 | 2023-11-28 10:57:31 | P_Welcome (0 донаций) на ранее рег. 28.11.2023 | Транзакционные выпуски | 1 | 100.00 | 100.00 | 0.00 | 0.00 | 0.0 |
| 2 | 2023-11-28 00:04:41 | Подтвержение email | Транзакционные выпуски | 73 | 94.52 | 28.98 | 8.69 | 4.10 | 0.0 |
| 3 | 2023-11-27 00:24:16 | DonorSearch.org - Данные для входа | Транзакционные выпуски | 156 | 95.51 | 36.91 | 6.71 | 4.48 | 0.0 |
| 4 | 2023-11-26 00:20:51 | DonorSearch.org - Данные для входа | Транзакционные выпуски | 89 | 94.38 | 34.52 | 4.76 | 3.37 | 0.0 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 3154 entries, 0 to 3153 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Дата 3154 non-null object 1 Название выпуска 3154 non-null object 2 Получатели 3154 non-null object 3 Отправлено 3154 non-null int64 4 Доставлено % 3071 non-null float64 5 OR % 3064 non-null float64 6 CTR % 3064 non-null float64 7 Ошибки % 3071 non-null float64 8 Отписки % 3064 non-null float64 dtypes: float64(5), int64(1), object(3) memory usage: 221.9+ KB Количество дубликатов - 2 Число пропусков - Дата 0 Название выпуска 0 Получатели 0 Отправлено 0 Доставлено % 83 OR % 90 CTR % 90 Ошибки % 83 Отписки % 90 dtype: int64 Доля пропусков - Дата 0.000000 Название выпуска 0.000000 Получатели 0.000000 Отправлено 0.000000 Доставлено % 0.026316 OR % 0.028535 CTR % 0.028535 Ошибки % 0.026316 Отписки % 0.028535 dtype: float64
| Отправлено | Доставлено % | OR % | CTR % | Ошибки % | Отписки % | |
|---|---|---|---|---|---|---|
| count | 3154.000000 | 3071.000000 | 3064.000000 | 3064.000000 | 3071.000000 | 3064.000000 |
| mean | 46.739379 | 98.474598 | 64.999778 | 21.104563 | 1.416044 | 0.583815 |
| std | 89.695591 | 6.634533 | 38.637461 | 30.797767 | 5.967797 | 3.433346 |
| min | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| 25% | 2.000000 | 99.030000 | 42.170000 | 0.000000 | 0.000000 | 0.000000 |
| 50% | 10.000000 | 100.000000 | 53.695000 | 7.185000 | 0.000000 | 0.000000 |
| 75% | 91.000000 | 100.000000 | 100.000000 | 30.892500 | 0.950000 | 0.000000 |
| max | 3515.000000 | 116.660000 | 600.000000 | 200.000000 | 100.000000 | 100.000000 |
df_st1.columns = df_st1.columns.str.lower().str.replace(' ', '_')
df_st1.columns
Index(['дата', 'название_выпуска', 'получатели', 'отправлено', 'доставлено_%',
'or_%', 'ctr_%', 'ошибки_%', 'отписки_%'],
dtype='object')
df_st1['дата'] = pd.to_datetime(df_st1['дата'], errors='coerce')
get_date_range_info(df_st1, 'дата')
'Данные представлены за период от 2018-05-15 17:55:06 до 2023-11-28 13:42:34, разница в 2022 days 19:47:28.'
df_st1.название_выпуска.unique()
array(['P_Запрос пожертвований на лояльных 28.11.2023',
'P_Welcome (0 донаций) на ранее рег. 28.11.2023',
'Подтвержение email', 'DonorSearch.org - Данные для входа',
'Спасибо за участие в донорском мероприятии',
'P_Welcome (0 донаций) на ранее рег.', 'Добро пожаловать',
'Значок отправлен', 'form_2_fill-draft',
'Подтверждение подписки на рассылку', 'Восстановление пароля',
'Донация загружена',
'«Мы помогаем каждому найти в себе донора»_02/11|23',
'Значки отправлены 28', 'Мы помогаем каждому найти в себе донора.',
'«А теперь я, как ты!» ver.1 - Лейка до 1.10.23',
'«А теперь я, как ты!» ver.1', 'Новый выпуск 10.10.2023, 23:58:14',
'Ваша донация отклонена!', 'ID 732 Новая карточка реципиента',
'Новая заявка на создание мероприятия',
'ID 722 Новая карточка реципиента',
'ID 667 Новая карточка реципиента', 'Нужны доноры, Казань июль',
'всемирный день донора 2023', 'Июнь инфо',
'Новый выпуск 06.06.2023, 15:43:01',
'Подтвердите подписку на рассылку', 'Марафон май финал',
'День донора_все', 'Донатеры 20 апреля 2023',
'Новый выпуск 10.04.2023, 19:40:24',
'Новый выпуск 04.04.2023, 13:47:26',
'Новый выпуск 06.03.2023, 20:55:38',
'Новый выпуск 11.02.2023, 19:46:42',
'Новый выпуск 25.01.2023, 16:33:41', 'тест тильда',
'Новый выпуск 30.12.2022, 16:35:15', 'рассылка ноября',
'день рождения проекта 2022', 'Значки отзывы 1-3',
'Рассылка октября', 'Новое письмо 14.10.2022, 14:42:26',
'Не верифицированы_2', 'значки отправлены_4',
'Значки отправлены_3', 'Значки отправлены_2',
'Значки_нет донаций 1',
'Создано из «Значки_старт заказов» 09.09.2022, 16:18',
'Марафон_октябрь', 'Значки_старт заказов', 'СПБ_нужны доноры',
'Поддержите нас', 'Бонусы июля',
'Спецпроект Тест кто ты 14.06.2022, 12:48',
'Анонс мероприятий к 14 июня Казань', 'марафон детали',
'яндекс бонус', 'марафон', '20 апреля', 'ТОПЫ 12.04.2022, 15:07',
'Мы в других соцсетях', 'Бонусы гетт',
'Завершение срока отвода от сдачи крови', 'Задежрка модерации',
'День Рождения проекта 04.11.2021', 'АСИ опрос 17.09.2021, 12:13',
'день донора', 'Конкурс «КиноПоиск HD»',
'«11 апреля ВДНХ КиноПоиск»',
'Создано из «Спецпроект 20 апреля» 19.04.2021, 22:17',
'Оповещение перед запланированной донацией',
'анонс конкурса все майки 24.01', 'итоги 2020 30.12.2020, 16:36',
'pwd_reset', 'Ваша донация одобрена!',
'День Рождения проекта 02.11.2020, 19:42',
'Восстановление пароля на портале добровольцыроссии.рф',
'Чат-бот о донорстве костного мозга 12.10.2020, 10:36',
'Проверка почты', 'Test', 'Такси для доноров 15.04.2020',
'Письмо подтверждения 2019-11-05T11:40:41.705Z',
'Письмо подтверждения 2019-11-05T14:48:59.298Z',
'C наступающим Новым годом', 'С любовью, твой реципиент',
'Донор спас два миллиона детей', 'Большая помощь и комары',
'Интересные исследования о донорстве крови',
'Понедельник и центры крови', 'Путешествия и акции',
'День рождения DonorSearch!',
'День Рождения Руслана и история Алены Фирсовой',
'Создано из «Новый выпуск 12.10.2019 14:48:42» 19.10.2019 01:01',
'Новый выпуск 12.10.2019 14:48:42',
'Новый выпуск 21.09.2019 20:59:02',
'конкурс shop21 09.08.2019 11:40',
'Создано из «Конкурс Всемайки Февраль» 19.03.2019 13:24',
'«День донора ВКонтакте» 14.06.2019»',
'«Конкурс Всемайки май» 30.05.2019', 'Казань майские нехватка',
'Конкурс Всемайки Февраль',
'Создано из «новый год» 26.12.18 10:21:30',
'Halloween в центре крови🎃', 'Подтверждение данных',
'Восстановление Пароля',
'Тестовая копия: [% anketa.base.firstName %], мы подготовили для доноров бонусную программу😉',
'Тестовая копия: Новый шаблон 15.05.2018 17:29:00',
'Письмо подтверждения'], dtype=object)
df_st1.получатели.unique()
array(['Транзакционные выпуски'], dtype=object)
df_st1[df_st1['ctr_%'].isnull()]
| дата | название_выпуска | получатели | отправлено | доставлено_% | or_% | ctr_% | ошибки_% | отписки_% | |
|---|---|---|---|---|---|---|---|---|---|
| 21 | 2023-11-18 00:47:54 | form_2_fill-draft | Транзакционные выпуски | 10 | 0.0 | NaN | NaN | 100.0 | NaN |
| 1490 | 2020-12-16 14:50:50 | pwd_reset | Транзакционные выпуски | 0 | NaN | NaN | NaN | NaN | NaN |
| 1494 | 2020-12-13 23:43:24 | pwd_reset | Транзакционные выпуски | 0 | NaN | NaN | NaN | NaN | NaN |
| 1540 | 2020-11-11 14:20:39 | pwd_reset | Транзакционные выпуски | 0 | NaN | NaN | NaN | NaN | NaN |
| 1576 | 2020-10-26 13:49:15 | Подтвержение email | Транзакционные выпуски | 1 | 0.0 | NaN | NaN | 100.0 | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 2928 | 2018-10-03 13:42:47 | pwd_reset | Транзакционные выпуски | 0 | NaN | NaN | NaN | NaN | NaN |
| 2936 | 2018-09-29 14:27:02 | pwd_reset | Транзакционные выпуски | 0 | NaN | NaN | NaN | NaN | NaN |
| 2941 | 2018-09-26 20:32:05 | pwd_reset | Транзакционные выпуски | 1 | 0.0 | NaN | NaN | 0.0 | NaN |
| 2984 | 2018-09-02 11:49:08 | pwd_reset | Транзакционные выпуски | 0 | NaN | NaN | NaN | NaN | NaN |
| 3130 | 2018-06-08 14:09:54 | Восстановление Пароля | Транзакционные выпуски | 0 | NaN | NaN | NaN | NaN | NaN |
90 rows × 9 columns
df_st1=df_st1.dropna().reset_index()
df_st1.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 3064 entries, 0 to 3063 Data columns (total 10 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 index 3064 non-null int64 1 дата 3064 non-null datetime64[ns] 2 название_выпуска 3064 non-null object 3 получатели 3064 non-null object 4 отправлено 3064 non-null int64 5 доставлено_% 3064 non-null float64 6 or_% 3064 non-null float64 7 ctr_% 3064 non-null float64 8 ошибки_% 3064 non-null float64 9 отписки_% 3064 non-null float64 dtypes: datetime64[ns](1), float64(5), int64(2), object(2) memory usage: 239.5+ KB
Переименованы колонки, удалены строки с дубликатами и пропусками так как там нет интересующих нас данных.
можно смотреть конверсию рассылок
Мероприятия 281123.csv- Информация о проведенных мероприятиях - онлайн и офлайн¶**Удалите мероприятие с более чем 10000 участников.
ID- Уникальный идентификатор мероприятия.
ID ОРГАНИЗАТОРА- Уникальный идентификатор организатора мероприятия.
НАЧАЛО- Начало мероприятия.
КОНЕЦ- Окончание мероприятия.
ЗАПИСАЛИСЬ НА МЕРОПРИЯТИЕ- Сколько пользователей сайта записалось
на мероприятие.
ГОРОД - В каком городе проходило мероприятие.
#Загрузка датасета
df_m = pd.read_csv(patch + 'Мероприятия 281123.csv')
df_m = inform(df_m)
| ID | ID ОРГАНИЗАТОРА | НАЧАЛО | КОНЕЦ | ЗАПИСАЛИСЬ НА МЕРОПРИЯТИЕ | ГОРОД | |
|---|---|---|---|---|---|---|
| 0 | 1697 | 506 | 04.12.2023 09:00 | 04.12.2023 14:00 | 1 | Россия, Москва |
| 1 | 1696 | 653 | 29.11.2023 09:00 | 29.11.2023 13:00 | 3 | Россия, Москва |
| 2 | 1695 | 558 | 01.12.2023 09:30 | 01.12.2023 11:30 | 9 | Россия, Татарстан, Казань |
| 3 | 1694 | 662 | 29.11.2023 14:30 | 29.11.2023 15:30 | 1 | Россия, Татарстан, Казань |
| 4 | 1693 | 284 | 28.11.2023 10:00 | 28.11.2023 13:15 | 22 | Россия, Москва |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 1539 entries, 0 to 1538 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID 1539 non-null int64 1 ID ОРГАНИЗАТОРА 1539 non-null int64 2 НАЧАЛО 1539 non-null object 3 КОНЕЦ 1539 non-null object 4 ЗАПИСАЛИСЬ НА МЕРОПРИЯТИЕ 1539 non-null int64 5 ГОРОД 1537 non-null object dtypes: int64(3), object(3) memory usage: 72.3+ KB Количество дубликатов - 0 Число пропусков - ID 0 ID ОРГАНИЗАТОРА 0 НАЧАЛО 0 КОНЕЦ 0 ЗАПИСАЛИСЬ НА МЕРОПРИЯТИЕ 0 ГОРОД 2 dtype: int64 Доля пропусков - ID 0.0000 ID ОРГАНИЗАТОРА 0.0000 НАЧАЛО 0.0000 КОНЕЦ 0.0000 ЗАПИСАЛИСЬ НА МЕРОПРИЯТИЕ 0.0000 ГОРОД 0.0013 dtype: float64
| ID | ID ОРГАНИЗАТОРА | ЗАПИСАЛИСЬ НА МЕРОПРИЯТИЕ | |
|---|---|---|---|
| count | 1539.000000 | 1539.000000 | 1539.000000 |
| mean | 797.858350 | 240.956465 | 13.585445 |
| std | 466.351391 | 180.339645 | 452.170408 |
| min | 1.000000 | 1.000000 | 0.000000 |
| 25% | 401.500000 | 98.500000 | 0.000000 |
| 50% | 786.000000 | 182.000000 | 0.000000 |
| 75% | 1176.500000 | 378.500000 | 0.000000 |
| max | 1697.000000 | 838.000000 | 17737.000000 |
df_m.columns = df_m.columns.str.lower().str.replace(' ', '_')
df_m.columns
Index(['id', 'id_организатора', 'начало', 'конец', 'записались_на_мероприятие',
'город'],
dtype='object')
df_m['начало'] = pd.to_datetime(df_m['начало'], format='%d.%m.%Y %H:%M', errors='coerce')
df_m['конец'] = pd.to_datetime(df_m['конец'],format='%d.%m.%Y %H:%M', errors='coerce')
df_m.nunique ()
id 1539 id_организатора 561 начало 1140 конец 1146 записались_на_мероприятие 55 город 238 dtype: int64
df_m.город.unique()
array(['Россия, Москва', 'Россия, Татарстан, Казань',
'Россия, Самарская область, Самара',
'Россия, Татарстан, Набережные Челны',
'Россия, Пензенская область, Пенза',
'Россия, Ростовская область, Ростов-на-Дону',
'Россия, Красноярский край, Красноярск',
'Россия, Татарстан, Альметьевск', 'Россия, Алтай, Горно-Алтайск',
'Россия, Калужская область, Обнинск',
'Россия, Омская область, Омск',
'Россия, Амурская область, Благовещенск',
'Россия, Калининградская область, Калининград',
'Россия, Тыва, Кызыл',
'Россия, Свердловская область, Екатеринбург',
'Россия, Саратовская область, Саратов',
'Россия, Карелия, Петрозаводск',
'Россия, Ростовская область, Сальск',
'Россия, Ростовская область, Таганрог', 'Россия, Санкт-Петербург',
'Россия, Курская область, Курск',
'Россия, Приморский край, Партизанск',
'Россия, Ивановская область, Иваново', nan,
'Россия, Забайкальский край, Чита',
'Россия, Московская область, Красногорск',
'Россия, Новосибирская область, Новосибирск',
'Россия, Башкортостан, Уфа', 'Россия, Пермский край, Пермь',
'Россия, Удмуртия, Ижевск', 'Россия, Кемеровская область, Тисуль',
'Россия, Воронежская область, Воронеж',
'Россия, Московская область, Электроизолятор',
'Россия, Московская область, Химки',
'Россия, Московская область, Долгопрудный',
'Россия, Московская область, Коломна', 'Россия, Крым, Симферополь',
'Россия, Мордовия, Саранск', 'Россия, Калужская область, Калуга',
'Россия, Томская область, Томск', 'Россия, Чувашия, Чебоксары',
'Россия, Алтайский край, Камень-на-Оби',
'Россия, Ивановская область, Кинешма',
'Россия, Магаданская область, Магадан',
'Россия, Ставропольский край, Пятигорск',
'Россия, Самарская область, Отрадный',
'Россия, Ярославская область, Переславль-Залесский',
'Россия, Приморский край, Владивосток',
'Россия, Тульская область, Дубна',
'Россия, Смоленская область, Смоленск',
'Россия, Алтайский край, Барнаул',
'Россия, Пензенская область, Заречный',
'Россия, Московская область, Домодедово',
'Россия, Свердловская область, Первоуральск',
'Россия, Алтайский край, Рубцовск',
'Россия, Московская область, Королёв',
'Россия, Нижегородская область, Нижний Новгород',
'Россия, Ульяновская область, Ульяновск',
'Россия, Московская область, Волоколамск',
'Россия, Тульская область, Тула',
'Россия, Псковская область, Псков',
'Россия, Владимирская область, Ковров',
'Россия, Астраханская область, Астрахань',
'Россия, Татарстан, Нижнекамск',
'Россия, Свердловская область, Заречный',
'Россия, Архангельская область, Архангельск',
'Россия, Московская область, Лобня',
'Россия, Саха /Якутия/, Якутск',
'Россия, Костромская область, Кострома',
'Россия, Смоленская область, Хотьково',
'Россия, Краснодарский край, Краснодар',
'Россия, Ярославская область, Ярославль',
'Россия, Московская область, Балашиха',
'Россия, Камчатский край, Петропавловск-Камчатский',
'Россия, Вологодская область, Молочное',
'Россия, Челябинская область, Трехгорный',
'Россия, Кемеровская область, Кемерово',
'Россия, Краснодарский край, Горячий Ключ',
'Россия, Тверская область, Тверь',
'Россия, Самарская область, Новокуйбышевск',
'Россия, Московская область, Жуковский',
'Россия, Хабаровский край, Хабаровск',
'Россия, Московская область, Сергиев Посад',
'Россия, Саратовская область, Балашов',
'Россия, Московская область, Подольск',
'Россия, Вологодская область, Вологда',
'Россия, Московская область, Щёлково',
'Россия, Московская область, Егорьевск',
'Россия, Московская область, Дубна',
'Россия, Волгоградская область, Волгоград',
'Россия, Ростовская область, Волгодонск',
'Россия, Ростовская область, Шахты',
'Россия, Кировская область, Киров',
'Россия, Ленинградская область, Шлиссельбург',
'Россия, Самарская область, Тольятти',
'Россия, Московская область, Зеленоград',
'Россия, Краснодарский край, Анапа',
'Россия, Московская область, Хотьково',
'Россия, Марий Эл, Йошкар-Ола',
'Россия, Челябинская область, Челябинск',
'Россия, Московская область, Электросталь',
'Россия, Ставропольский край, Буденновск',
'Россия, Краснодарский край, Динская', 'Россия, Крым, Бахчисарай',
'Россия, Московская область, Реутов',
'Россия, Ростовская область, Королев',
'Россия, Ленинградская область, Отрадное',
'Россия, Орловская область, Льгов',
'Россия, Курганская область, Курган',
'Россия, Московская область, Раменское',
'Россия, Свердловская область, Новоуральск',
'Россия, Иркутская область, Иркутск',
'Россия, Ленинградская область, Кингисепп',
'Россия, Ленинградская область, Пикалево',
'Россия, Ленинградская область, Бокситогорск',
'Россия, Орловская область, Орёл', 'Россия, Алтайский край, Бийск',
'Россия, Тюменская область, Тюмень',
'Россия, Пензенская область, Мокшан',
'Россия, Татарстан, Чистополь', 'Россия, Пермский край, Кизел',
'Россия, Архангельская область, Северодвинск',
'Россия, Московская область, Орехово-Зуево',
'Россия, Кемеровская область, Юрга',
'Россия, Калининградская область, Советск',
'Россия, Липецкая область, Задонск',
'Россия, Мурманская область, Заполярный',
'Россия, Ленинградская область, Кириши',
'Россия, Ленинградская область, Волхов',
'Россия, Московская область, Павловский Посад',
'Россия, Ставропольский край, Минеральные Воды',
'Россия, Мордовия, Песочный',
'Россия, Московская область, Пушкино',
'Россия, Московская область, Можайск',
'Россия, Пермский край, Лысьва',
'Россия, Еврейская АОбл, Биробиджан',
'Россия, Мурманская область, Кировск',
'Россия, Нижегородская область, Алатырь',
'Россия, Нижегородская область, Лысково',
'Россия, Оренбургская область, Оренбург', 'Россия, Чечня, Грозный',
'Россия, Липецкая область, Липецк',
'Россия, Пермский край, Березники',
'Россия, Калужская область, Мещовск',
'Россия, Калининградская область, Черняховск',
'Россия, Московская область, Черноголовка',
'Россия, Московская область, Воскресенск',
'Россия, Калининградская область, Неман',
'Россия, Белгородская область, Белгород',
'Россия, Волгоградская область, Камышин',
'Россия, Ленинградская область, Сясьстрой',
'Россия, Брянская область, Брянск',
'Россия, Московская область, Одинцово', 'Россия, Коми, Ухта',
'Россия, Ставропольский край, Ставрополь',
'Россия, Вологодская область, Щелково',
'Россия, Ленинградская область, Луга',
'Россия, Челябинская область, Озерск',
'Россия, Ханты-Мансийский Автономный округ - Югра АО, Ханты-Мансийск',
'Россия, Челябинская область, Чебаркуль',
'Россия, Брянская область, Лиски',
'Россия, Ленинградская область, Павлово',
'_, Донецкая область, Донецк',
'Россия, Воронежская область, Борисоглебск',
'Россия, Ленинградская область, Сланцы',
'Россия, Мурманская область, Мурманск',
'Россия, Нижегородская область, Бор',
'Россия, Нижегородская область, Ветлуга',
'Россия, Нижегородская область, Кстово',
'Россия, Нижегородская область, Заволжье',
'Россия, Ярославская область, Гаврилов-Ям',
'Россия, Ханты-Мансийский Автономный округ - Югра АО, Сургут',
'Россия, Смоленская область, Десногорск',
'Россия, Бурятия, Улан-Удэ',
'Россия, Нижегородская область, Княгинино',
'Россия, Пермский край, Соликамск',
'Россия, Нижегородская область, Богородск',
'Россия, Челябинская область, Магнитогорск',
'Россия, Крым, Севастополь', '_, Херсонская область, Молочное',
'Россия, Тульская область, Венев',
'Россия, Красноярский край, Лесосибирск',
'Россия, Ленинградская область, Коммунар',
'Россия, Свердловская область, Усть-Кишерть',
'Россия, Краснодарский край, Сочи',
'Россия, Нижегородская область, Выкса',
'Россия, Иркутская область, Перевоз',
'Россия, Московская область, Серпухов',
'Россия, Ставропольский край, Георгиевск',
'Россия, Московская область, Краснознаменск',
'Россия, Ленинградская область, Всеволожск',
'Беларусь, Минская область, Минск',
'Россия, Пермский край, Добрянка',
'Россия, Московская область, Клин',
'Россия, Московская область, Дмитров',
'Россия, Калужская область, Малоярославец', 'Молдова, Тирасполь',
'Россия, Калининградская область, Гусев',
'Россия, Сахалинская область, Горнозаводск',
'Россия, Московская область, Шатура',
'Россия, Московская область, Рошаль',
'Россия, Красноярский край, Заозерный',
'Россия, Московская область, Электрогорск',
'Россия, Московская область, Луховицы',
'Россия, Пермский край, Гремячинск',
'Россия, Калининградская область, Нестеров',
'Россия, Московская область, Шаховская',
'Россия, Мурманская область, Полярный',
'Россия, Мурманская область, Апатиты',
'Россия, Ленинградская область, Волосово',
'Россия, Калининградская область, Балтийск',
'Россия, Мурманская область, Оленегорск',
'Россия, Ленинградская область, Тихвин',
'Россия, Мурманская область, Снежногорск',
'Россия, Челябинская область, Нязепетровск',
'Россия, Ленинградская область, Никольское',
'Россия, Московская область, Янино',
'Россия, Ленинградская область, Ломоносов',
'Россия, Краснодарский край, Усть-Лабинск',
'Россия, Татарстан, Буинск', 'Таджикистан, Чкаловск',
'Беларусь, Витебская область, Витебск',
'Россия, Кабардино-Балкарская, Нальчик',
'Россия, Калмыкия, Элиста',
'Россия, Свердловская область, Сысерть',
'Россия, Красноярский край, Шарыпово',
'Казахстан, Восточно-Казахстанская область, Усть-Каменогорск',
'Россия, Ингушетия, Назрань', 'Россия, Рязанская область, Рязань',
'Россия, Московская область, Видное',
'Россия, Дагестан, Махачкала', 'Россия, Красноярский край, Ачинск',
'Россия, Свердловская область, Нижний Тагил',
'Россия, Тюменская область, Ишим',
'Россия, Ленинградская область, Гатчина',
'Россия, Кемеровская область, Новокузнецк', 'Россия, Крым, Керчь',
'Россия, Рязанская область, Пущино',
'Россия, Ленинградская область, Агалатово'], dtype=object)
get_date_range_info(df_m, 'начало')
'Данные представлены за период от 2017-09-11 10:13:00 до 2023-12-04 09:00:00, разница в 2274 days 22:47:00.'
get_date_range_info(df_m, 'конец')
'Данные представлены за период от 2017-09-11 12:00:00 до 2023-12-04 14:00:00, разница в 2275 days 02:00:00.'
df_m[df_m['город'].isnull()]
| id | id_организатора | начало | конец | записались_на_мероприятие | город | |
|---|---|---|---|---|---|---|
| 92 | 1578 | 589 | 2023-04-07 11:45:00 | 2023-04-07 12:45:00 | 4 | NaN |
| 146 | 1520 | 537 | 2022-08-01 00:00:00 | 2023-01-31 00:00:00 | 17737 | NaN |
df_m=df_m.dropna()
df_m.записались_на_мероприятие.value_counts()
0 1338 1 40 2 17 3 12 8 12 4 11 9 11 6 7 11 5 5 5 13 4 21 4 14 4 31 4 22 4 18 3 17 3 19 3 30 3 32 3 7 3 34 2 10 2 27 2 25 2 15 2 46 2 58 2 99 2 53 1 74 1 67 1 65 1 16 1 33 1 50 1 38 1 66 1 26 1 54 1 98 1 12 1 35 1 20 1 23 1 59 1 91 1 36 1 83 1 71 1 95 1 41 1 60 1 29 1 Name: записались_на_мероприятие, dtype: int64
df_m.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 1537 entries, 0 to 1538 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 1537 non-null int64 1 id_организатора 1537 non-null int64 2 начало 1537 non-null datetime64[ns] 3 конец 1537 non-null datetime64[ns] 4 записались_на_мероприятие 1537 non-null int64 5 город 1537 non-null object dtypes: datetime64[ns](2), int64(3), object(1) memory usage: 84.1+ KB
joined_users 281123.csv- данные о донорах, участниках мероприятий¶Пользователи присоединившиеся к мероприятиям
id донора- Уникальный идентификатор донора.
id мероприятия- Уникальный идентификатор мероприятия.
`Выбранная дата донации - Дата мероприятия, когда пользователь его посетил (бывают мероприятия боле 1 дня).
Количество подтвержденных донаций- Количество всех подтвержденных
донаций пользователя, информацию о которых он загрузил на сайт.
#Загрузка датасета
df_ju = pd.read_csv(patch + 'joined_users 281123.csv')
df_ju = inform(df_ju)
| id донора | id мероприятия | Выбранная дата донации | Количество подтвержденных донаций | |
|---|---|---|---|---|
| 0 | 276176 | 1696 | 2023-11-29 | 0.0 |
| 1 | 276173 | 1696 | 2023-11-29 | 0.0 |
| 2 | 276172 | 1696 | 2023-11-29 | 0.0 |
| 3 | 276154 | 1693 | 2023-11-28 | 0.0 |
| 4 | 275568 | 1693 | 2023-11-28 | 0.0 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 20908 entries, 0 to 20907 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id донора 20908 non-null int64 1 id мероприятия 20908 non-null int64 2 Выбранная дата донации 20908 non-null object 3 Количество подтвержденных донаций 15472 non-null float64 dtypes: float64(1), int64(2), object(1) memory usage: 653.5+ KB Количество дубликатов - 0 Число пропусков - id донора 0 id мероприятия 0 Выбранная дата донации 0 Количество подтвержденных донаций 5436 dtype: int64 Доля пропусков - id донора 0.000000 id мероприятия 0.000000 Выбранная дата донации 0.000000 Количество подтвержденных донаций 0.259996 dtype: float64
| id донора | id мероприятия | Количество подтвержденных донаций | |
|---|---|---|---|
| count | 20908.000000 | 20908.000000 | 15472.000000 |
| mean | 182965.417209 | 1484.488234 | 0.550608 |
| std | 34694.563474 | 199.672786 | 4.592153 |
| min | 19.000000 | 221.000000 | 0.000000 |
| 25% | 163338.500000 | 1520.000000 | 0.000000 |
| 50% | 181220.500000 | 1520.000000 | 0.000000 |
| 75% | 199088.250000 | 1520.000000 | 0.000000 |
| max | 276176.000000 | 1697.000000 | 159.000000 |
df_ju.columns = df_ju.columns.str.lower().str.replace(' ', '_')
df_ju.columns
Index(['id_донора', 'id_мероприятия', 'выбранная_дата_донации',
'количество_подтвержденных_донаций'],
dtype='object')
df_ju['выбранная_дата_донации']
0 2023-11-29
1 2023-11-29
2 2023-11-29
3 2023-11-28
4 2023-11-28
...
20903 2020-09-17
20904 2020-09-17
20905 2020-09-05
20906 2020-09-05
20907 2020-09-17
Name: выбранная_дата_донации, Length: 20908, dtype: object
df_ju['выбранная_дата_донации'] = pd.to_datetime(df_ju['выбранная_дата_донации'],errors='coerce')
get_date_range_info(df_ju, 'выбранная_дата_донации')
'Данные представлены за период от 2020-09-05 00:00:00 до 2023-12-04 00:00:00, разница в 1185 days 00:00:00.'
df_ju.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 20908 entries, 0 to 20907 Data columns (total 4 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id_донора 20908 non-null int64 1 id_мероприятия 20908 non-null int64 2 выбранная_дата_донации 20908 non-null datetime64[ns] 3 количество_подтвержденных_донаций 15472 non-null float64 dtypes: datetime64[ns](1), float64(1), int64(2) memory usage: 653.5 KB
df_ju.nunique()
id_донора 19985 id_мероприятия 201 выбранная_дата_донации 172 количество_подтвержденных_донаций 57 dtype: int64
df_ju['количество_подтвержденных_донаций'].value_counts(dropna=False)
0.0 14456 NaN 5436 1.0 346 2.0 118 3.0 88 5.0 50 8.0 48 4.0 37 12.0 33 6.0 32 10.0 31 11.0 29 7.0 23 9.0 18 15.0 18 19.0 18 18.0 11 29.0 10 24.0 8 25.0 7 13.0 7 16.0 7 14.0 7 21.0 6 77.0 5 26.0 5 17.0 5 22.0 3 31.0 3 37.0 3 20.0 3 33.0 3 159.0 2 102.0 2 42.0 2 56.0 2 30.0 2 23.0 2 34.0 2 78.0 2 80.0 1 43.0 1 47.0 1 93.0 1 82.0 1 40.0 1 126.0 1 61.0 1 115.0 1 52.0 1 67.0 1 71.0 1 73.0 1 51.0 1 38.0 1 64.0 1 121.0 1 156.0 1 Name: количество_подтвержденных_донаций, dtype: int64
users_anon_data 281123.csv - данные о пользователях¶Данные пользователей в системе
ID- Уникальный идентификатор донора.
Пол- Пол донора; заполняется в анкете самим донором; возможные значения:
мужской, женский, не указано.
Дата рождения- Дата рождения донора; заполняется в анкете самим донором;
может быть не указана.
Регион- Регион проживания; заполняется в анкете самим донором; может быть
не указан.
Группа крови-Группа крови донора в формате O(I) Rh-; заполняется в
анкете самим донором; может быть не указана.
Kell-фактор Это такой же белок (антиген), как группа крови в системе АВО и
резус-фактор. Как и другие групповые антигены, К-антиген передается по
наследству и не является патологией. Подробней про kell-фактор и донорство.
Заполняется в анкете самим донором; может быть не указан.
В следующих колонках донор отмечает свою готовность сдавать кровь и/или ее компоненты. Возможные значения столбца: Да, Нет.
Цельная кровь
Плазма
Тромбоциты
Эритроциты
Лейкоциты
Костный мозг
Почетный донор-Дата присвоения донору звания «Почётный донор России».
Высчитывается автоматически на основе загруженных донором справках о
дотации. У большинства доноров не заполнена.
Отвод от донации- Отвод от сдачи крови по медицинским причинам;
проставляется самим донором.
В следующих колонках отмечено сдавал ли донор кровь и/или ее компоненты. И сколько раз он это делал. Заполняется на основе данных о загруженных донациях донора.
Цельная кровь1
Плазма1
Тромбоциты1
Эритроциты1
Лейкоциты1
Дата регистрации- Дата регистрации на сайте.
Не подтверждённые донации- Количество донаций донора, о которых он
сообщил на момент выгрузки, но не подтвердил справками. Возможно, сюда
так же сходят не подтвержденные заявки (не прошедшие модерацию).
Прошедших донаций- Количество донаций донора, о которых он сообщил на
момент выгрузки и подтвердил справками.
Донаций до регистрации- Количество донаций донора, сделанных им до
регистрации на сайте и подтвержденных справками.
Последняя активность- Последняя активность на сайте.
Теги- Отвечает на вопрос “с какой страницы пользователь перешел на
регистрацию?”
Указан email- После анонимизации - указал ли донор email в анкете.
Указан телефон После анонимизации - указал ли донор телефон в анкете.
В следующих колонках отмечено какие соцсети привязал пользователь к профилю - через них пользователь сможет авторизоваться:
Авторизация через ВК
Авторизация через Одноклассники
Авторизация через Твиттер
Авторизация через Яндекс
Авторизация через Гугл
Подтверждённые донации- Дублирует столбец Прошедших донаций.
Получен значок 20-Возможные значения столбца: Да, Нет.
Получен значок 100- Возможные значения столбца: Да, Нет.
Донаций на момент регистрации- Дублирует столбец Донаций до
регистрации
Количество взятых бонусов- Количество бонусов, взятых пользователем за
все время существования сайта до момента выгрузки.
#Загрузка датасета
df_us = pd.read_csv(patch + 'users_anon_data 281123.csv')
df_us = inform(df_us)
| ID | Пол | Дата рождения | Регион | Группа крови | Kell-фактор | Цельная кровь | Плазма | Тромбоциты | Эритроциты | Лейкоциты | Костный мозг | Почетный донор | Отвод от донации | Цельная кровь.1 | Плазма.1 | Тромбоциты.1 | Эритроциты.1 | Лейкоциты.1 | Дата регистрации | Не подтверждённые донации | Прошедших донаций | Донаций до регистрации | Последняя активность | Теги | Указан email | Указан телефон | Авторизация через ВК | Авторизация через Одноклассники | Авторизация через Твиттер | Авторизация через Яндекс | Авторизация через Гугл | Подтверждённые донации | Получен значок 20 | Получен значок 100 | Донаций на момент регистрации | Количество взятых бонусов | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 276179 | Не указано | Не указано | Не указано | Не указано | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 28.11.2023 | 0 | 0 | Не указано | Не указано | ['Blood'] | да | нет | нет | нет | нет | нет | нет | 0 | нет | нет | Не указано | 0 |
| 1 | 276178 | Женский | 01.05.1991 | Россия, Вологодская область, Вологда | A(II) Rh+ | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 28.11.2023 | 0 | 0 | 1 | 28.11.2023 | ['CardsMobile'] | да | да | нет | нет | нет | нет | нет | 0 | нет | нет | 1 | 0 |
| 2 | 276177 | Не указано | Не указано | Не указано | Не указано | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 28.11.2023 | 0 | 0 | Не указано | 28.11.2023 | ['DirectSignUp'] | нет | да | нет | нет | нет | нет | нет | 0 | нет | нет | Не указано | 0 |
| 3 | 276176 | Не указано | Не указано | Не указано | Не указано | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 28.11.2023 | 0 | 0 | 1 | 28.11.2023 | ['UnityOrganizations'] | нет | да | нет | нет | нет | нет | нет | 0 | нет | нет | 1 | 0 |
| 4 | 276175 | Мужской | 10.01.1986 | Россия, Камчатский край, Петропавловск-Камчатский | A(II) Rh- | Не указано | Да | Да | Да | Да | Да | Да | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 28.11.2023 | 1 | 0 | 4 | 28.11.2023 | ['CardsMobile'] | да | да | нет | нет | нет | нет | нет | 0 | нет | нет | 4 | 0 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 265836 entries, 0 to 265835 Data columns (total 37 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID 265836 non-null int64 1 Пол 265836 non-null object 2 Дата рождения 265836 non-null object 3 Регион 265836 non-null object 4 Группа крови 265836 non-null object 5 Kell-фактор 265836 non-null object 6 Цельная кровь 265836 non-null object 7 Плазма 265836 non-null object 8 Тромбоциты 265836 non-null object 9 Эритроциты 265836 non-null object 10 Лейкоциты 265836 non-null object 11 Костный мозг 265836 non-null object 12 Почетный донор 265836 non-null object 13 Отвод от донации 265836 non-null object 14 Цельная кровь.1 265836 non-null int64 15 Плазма.1 265836 non-null int64 16 Тромбоциты.1 265836 non-null int64 17 Эритроциты.1 265836 non-null int64 18 Лейкоциты.1 265836 non-null int64 19 Дата регистрации 265836 non-null object 20 Не подтверждённые донации 265836 non-null int64 21 Прошедших донаций 265836 non-null int64 22 Донаций до регистрации 265836 non-null object 23 Последняя активность 265836 non-null object 24 Теги 265836 non-null object 25 Указан email 265836 non-null object 26 Указан телефон 265836 non-null object 27 Авторизация через ВК 265836 non-null object 28 Авторизация через Одноклассники 265836 non-null object 29 Авторизация через Твиттер 265836 non-null object 30 Авторизация через Яндекс 265836 non-null object 31 Авторизация через Гугл 265836 non-null object 32 Подтверждённые донации 265836 non-null int64 33 Получен значок 20 265836 non-null object 34 Получен значок 100 265836 non-null object 35 Донаций на момент регистрации 265836 non-null object 36 Количество взятых бонусов 265836 non-null int64 dtypes: int64(10), object(27) memory usage: 75.0+ MB Количество дубликатов - 0 Число пропусков - ID 0 Пол 0 Дата рождения 0 Регион 0 Группа крови 0 Kell-фактор 0 Цельная кровь 0 Плазма 0 Тромбоциты 0 Эритроциты 0 Лейкоциты 0 Костный мозг 0 Почетный донор 0 Отвод от донации 0 Цельная кровь.1 0 Плазма.1 0 Тромбоциты.1 0 Эритроциты.1 0 Лейкоциты.1 0 Дата регистрации 0 Не подтверждённые донации 0 Прошедших донаций 0 Донаций до регистрации 0 Последняя активность 0 Теги 0 Указан email 0 Указан телефон 0 Авторизация через ВК 0 Авторизация через Одноклассники 0 Авторизация через Твиттер 0 Авторизация через Яндекс 0 Авторизация через Гугл 0 Подтверждённые донации 0 Получен значок 20 0 Получен значок 100 0 Донаций на момент регистрации 0 Количество взятых бонусов 0 dtype: int64 Доля пропусков - ID 0.0 Пол 0.0 Дата рождения 0.0 Регион 0.0 Группа крови 0.0 Kell-фактор 0.0 Цельная кровь 0.0 Плазма 0.0 Тромбоциты 0.0 Эритроциты 0.0 Лейкоциты 0.0 Костный мозг 0.0 Почетный донор 0.0 Отвод от донации 0.0 Цельная кровь.1 0.0 Плазма.1 0.0 Тромбоциты.1 0.0 Эритроциты.1 0.0 Лейкоциты.1 0.0 Дата регистрации 0.0 Не подтверждённые донации 0.0 Прошедших донаций 0.0 Донаций до регистрации 0.0 Последняя активность 0.0 Теги 0.0 Указан email 0.0 Указан телефон 0.0 Авторизация через ВК 0.0 Авторизация через Одноклассники 0.0 Авторизация через Твиттер 0.0 Авторизация через Яндекс 0.0 Авторизация через Гугл 0.0 Подтверждённые донации 0.0 Получен значок 20 0.0 Получен значок 100 0.0 Донаций на момент регистрации 0.0 Количество взятых бонусов 0.0 dtype: float64
| ID | Цельная кровь.1 | Плазма.1 | Тромбоциты.1 | Эритроциты.1 | Лейкоциты.1 | Не подтверждённые донации | Прошедших донаций | Подтверждённые донации | Количество взятых бонусов | |
|---|---|---|---|---|---|---|---|---|---|---|
| count | 265836.000000 | 265836.000000 | 265836.000000 | 265836.000000 | 265836.000000 | 265836.000000 | 265836.000000 | 265836.000000 | 265836.000000 | 265836.000000 |
| mean | 137111.079737 | 0.538388 | 0.208557 | 0.088957 | 0.001467 | 0.000248 | 0.091590 | 0.837618 | 0.838400 | 0.079402 |
| std | 79988.041752 | 2.822638 | 3.085964 | 1.486375 | 0.054217 | 0.020155 | 0.912188 | 5.350669 | 5.351517 | 0.654081 |
| min | 1.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| 25% | 67520.750000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| 50% | 136353.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| 75% | 206494.250000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
| max | 276179.000000 | 145.000000 | 299.000000 | 139.000000 | 8.000000 | 4.000000 | 84.000000 | 361.000000 | 361.000000 | 87.000000 |
df_us.columns = df_us.columns.str.lower().str.replace(' ', '_')
df_us.columns = df_us.columns.str.lower().str.replace('.', '_')
df_us.columns
Index(['id', 'пол', 'дата_рождения', 'регион', 'группа_крови', 'kell-фактор',
'цельная_кровь', 'плазма', 'тромбоциты', 'эритроциты', 'лейкоциты',
'костный_мозг', 'почетный_донор', 'отвод_от_донации', 'цельная_кровь_1',
'плазма_1', 'тромбоциты_1', 'эритроциты_1', 'лейкоциты_1',
'дата_регистрации', 'не_подтверждённые_донации', 'прошедших_донаций',
'донаций_до_регистрации', 'последняя_активность', 'теги',
'указан_email', 'указан_телефон', 'авторизация_через_вк',
'авторизация_через_одноклассники', 'авторизация_через_твиттер',
'авторизация_через_яндекс', 'авторизация_через_гугл',
'подтверждённые_донации', 'получен_значок_20', 'получен_значок_100',
'донаций_на_момент_регистрации', 'количество_взятых_бонусов'],
dtype='object')
#Разбивка региона на компоненты
df_us[['страна', 'область', 'город']] = df_us['регион'].str.split(', ', expand=True, n=2)
df_us['город'] = df_us['город'].fillna(df_us['область'])
df_us['область'] = df_us['область'].fillna('Не указано')
df_us['город'] = df_us['город'].fillna('Не указано')
columns_to_convert = ['указан_email', 'указан_телефон', 'авторизация_через_вк',
'авторизация_через_одноклассники', 'авторизация_через_твиттер', 'авторизация_через_яндекс', 'авторизация_через_гугл']
df_us[columns_to_convert] = df_us[columns_to_convert].replace({'да': True, 'нет': False})
df_us.nunique()
id 265836 пол 3 дата_рождения 15944 регион 2648 группа_крови 10 kell-фактор 4 цельная_кровь 2 плазма 2 тромбоциты 2 эритроциты 2 лейкоциты 2 костный_мозг 2 почетный_донор 1476 отвод_от_донации 734 цельная_кровь_1 76 плазма_1 140 тромбоциты_1 77 эритроциты_1 9 лейкоциты_1 5 дата_регистрации 1722 не_подтверждённые_донации 55 прошедших_донаций 172 донаций_до_регистрации 167 последняя_активность 1103 теги 21 указан_email 2 указан_телефон 2 авторизация_через_вк 2 авторизация_через_одноклассники 2 авторизация_через_твиттер 2 авторизация_через_яндекс 2 авторизация_через_гугл 2 подтверждённые_донации 172 получен_значок_20 2 получен_значок_100 2 донаций_на_момент_регистрации 166 количество_взятых_бонусов 35 страна 108 область 461 город 2557 dtype: int64
df_us['дата_рождения'].value_counts()
Не указано 169313
25.07.2000 32
01.01.2000 30
01.03.2000 28
29.09.1998 27
...
17.06.1975 1
10.02.1962 1
13.06.1975 1
01.09.1956 1
30.04.1953 1
Name: дата_рождения, Length: 15944, dtype: int64
df_us['дата_рождения'] = pd.to_datetime(df_us['дата_рождения'],format='%d.%m.%Y',errors='coerce')
df_us['дата_рождения'].value_counts(dropna=False)
NaT 169325
2000-07-25 32
2000-01-01 30
2000-03-01 28
1998-09-29 27
...
2005-06-11 1
1971-06-21 1
2012-05-08 1
1962-08-24 1
1953-04-30 1
Name: дата_рождения, Length: 15932, dtype: int64
(df_us['дата_рождения'].dt.year).unique()
array([ nan, 1991., 1986., 1976., 1990., 1978., 2000., 1992., 1995.,
1983., 2002., 1989., 2003., 2001., 1997., 1979., 1984., 1996.,
1993., 2005., 2009., 2004., 1998., 1999., 1980., 1988., 1987.,
1994., 1982., 2007., 1972., 1981., 1971., 1974., 1964., 1948.,
1973., 1961., 1966., 1977., 1985., 1967., 2006., 2008., 1970.,
2011., 1968., 1975., 1963., 1965., 1955., 1969., 2018., 1951.,
1957., 1956., 2010., 2013., 2021., 1962., 2016., 1952., 1953.,
1960., 2014., 1959., 1927., 2019., 2020., 2017., 1958., 1930.,
2015., 1929., 2012., 1954., 1940., 1902., 1942., 1945., 1950.,
1943., 1932., 1919., 1928., 1910., 1900., 1920., 1947., 1946.,
1933., 1949., 1936., 1904., 1911., 1917., 1905., 1909., 1915.,
1907., 1926., 1925., 1922., 1939., 1916., 1903., 1941., 2083.,
2070., 2198., 1888., 1908., 2095., 1938., 2067., 1923., 1931.,
2089., 1944., 1913., 1912., 1937., 1918., 1901., 1914., 1897.,
1906.])
df_us.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 265836 entries, 0 to 265835 Data columns (total 40 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 265836 non-null int64 1 пол 265836 non-null object 2 дата_рождения 96511 non-null datetime64[ns] 3 регион 265836 non-null object 4 группа_крови 265836 non-null object 5 kell-фактор 265836 non-null object 6 цельная_кровь 265836 non-null object 7 плазма 265836 non-null object 8 тромбоциты 265836 non-null object 9 эритроциты 265836 non-null object 10 лейкоциты 265836 non-null object 11 костный_мозг 265836 non-null object 12 почетный_донор 265836 non-null object 13 отвод_от_донации 265836 non-null object 14 цельная_кровь_1 265836 non-null int64 15 плазма_1 265836 non-null int64 16 тромбоциты_1 265836 non-null int64 17 эритроциты_1 265836 non-null int64 18 лейкоциты_1 265836 non-null int64 19 дата_регистрации 265836 non-null object 20 не_подтверждённые_донации 265836 non-null int64 21 прошедших_донаций 265836 non-null int64 22 донаций_до_регистрации 265836 non-null object 23 последняя_активность 265836 non-null object 24 теги 265836 non-null object 25 указан_email 265836 non-null bool 26 указан_телефон 265836 non-null bool 27 авторизация_через_вк 265836 non-null bool 28 авторизация_через_одноклассники 265836 non-null bool 29 авторизация_через_твиттер 265836 non-null bool 30 авторизация_через_яндекс 265836 non-null bool 31 авторизация_через_гугл 265836 non-null bool 32 подтверждённые_донации 265836 non-null int64 33 получен_значок_20 265836 non-null object 34 получен_значок_100 265836 non-null object 35 донаций_на_момент_регистрации 265836 non-null object 36 количество_взятых_бонусов 265836 non-null int64 37 страна 265836 non-null object 38 область 265836 non-null object 39 город 265836 non-null object dtypes: bool(7), datetime64[ns](1), int64(10), object(22) memory usage: 68.7+ MB
min_date = df_us['дата_рождения'].min()
min_date
Timestamp('1888-09-22 00:00:00')
max_date =df_us['дата_рождения'].max()
max_date
Timestamp('2198-04-29 00:00:00')
df_us.query('дата_рождения> "2023-01-01 00:00:00"')
| id | пол | дата_рождения | регион | группа_крови | kell-фактор | цельная_кровь | плазма | тромбоциты | эритроциты | лейкоциты | костный_мозг | почетный_донор | отвод_от_донации | цельная_кровь_1 | плазма_1 | тромбоциты_1 | эритроциты_1 | лейкоциты_1 | дата_регистрации | не_подтверждённые_донации | прошедших_донаций | донаций_до_регистрации | последняя_активность | теги | указан_email | указан_телефон | авторизация_через_вк | авторизация_через_одноклассники | авторизация_через_твиттер | авторизация_через_яндекс | авторизация_через_гугл | подтверждённые_донации | получен_значок_20 | получен_значок_100 | донаций_на_момент_регистрации | количество_взятых_бонусов | страна | область | город | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 125746 | 145977 | Мужской | 2083-06-18 | Россия, Новосибирская область, Новосибирск | Не указано | Положительный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 21.05.2020 | 0 | 0 | Не указано | 17.08.2022 | [None] | True | False | False | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Новосибирская область | Новосибирск |
| 126570 | 145144 | Женский | 2070-09-10 | Россия, Самарская область, Сызрань | A(II) Rh+ | Отрицательный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 21.05.2020 | 0 | 0 | Не указано | 05.08.2022 | [None] | False | False | False | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Самарская область | Сызрань |
| 126781 | 144925 | Мужской | 2198-04-29 | Россия, Иркутская область, Иркутск | B(III) Rh- | Положительный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 21.05.2020 | 0 | 0 | Не указано | 18.08.2022 | [None] | True | True | False | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Иркутская область | Иркутск |
| 129193 | 142432 | Женский | 2095-01-03 | Россия, Коми, Сыктывкар | AB(IV) Rh+ | Отрицательный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 21.05.2020 | 0 | 0 | Не указано | 13.09.2022 | [None] | False | True | False | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Коми | Сыктывкар |
| 130734 | 140547 | Женский | 2067-07-26 | Россия, Татарстан, Набережные Челны | A(II) Rh+ | Отрицательный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 20.04.2020 | 0 | 0 | Не указано | Не указано | [None] | False | False | False | True | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Татарстан | Набережные Челны |
| 134560 | 136988 | Мужской | 2089-11-20 | Россия, Татарстан, Казань | B(III) Rh+ | Положительный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 14.02.2019 | 0 | 0 | Не указано | Не указано | [None] | True | True | True | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Татарстан | Казань |
df_us['дата_рождения'] = df_us['дата_рождения'].apply(lambda x: x.replace(year=x.year - 100) if x.year > 2024 else x)
df_us.query('дата_рождения> "2023-01-01 00:00:00"')
| id | пол | дата_рождения | регион | группа_крови | kell-фактор | цельная_кровь | плазма | тромбоциты | эритроциты | лейкоциты | костный_мозг | почетный_донор | отвод_от_донации | цельная_кровь_1 | плазма_1 | тромбоциты_1 | эритроциты_1 | лейкоциты_1 | дата_регистрации | не_подтверждённые_донации | прошедших_донаций | донаций_до_регистрации | последняя_активность | теги | указан_email | указан_телефон | авторизация_через_вк | авторизация_через_одноклассники | авторизация_через_твиттер | авторизация_через_яндекс | авторизация_через_гугл | подтверждённые_донации | получен_значок_20 | получен_значок_100 | донаций_на_момент_регистрации | количество_взятых_бонусов | страна | область | город | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 126781 | 144925 | Мужской | 2098-04-29 | Россия, Иркутская область, Иркутск | B(III) Rh- | Положительный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 21.05.2020 | 0 | 0 | Не указано | 18.08.2022 | [None] | True | True | False | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Иркутская область | Иркутск |
df_us.query('дата_рождения> "2005-01-01 00:00:00"')
| id | пол | дата_рождения | регион | группа_крови | kell-фактор | цельная_кровь | плазма | тромбоциты | эритроциты | лейкоциты | костный_мозг | почетный_донор | отвод_от_донации | цельная_кровь_1 | плазма_1 | тромбоциты_1 | эритроциты_1 | лейкоциты_1 | дата_регистрации | не_подтверждённые_донации | прошедших_донаций | донаций_до_регистрации | последняя_активность | теги | указан_email | указан_телефон | авторизация_через_вк | авторизация_через_одноклассники | авторизация_через_твиттер | авторизация_через_яндекс | авторизация_через_гугл | подтверждённые_донации | получен_значок_20 | получен_значок_100 | донаций_на_момент_регистрации | количество_взятых_бонусов | страна | область | город | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 73 | 276106 | Женский | 2005-07-14 | Россия, Москва | Не указано | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 27.11.2023 | 0 | 0 | Не указано | 27.11.2023 | ['MainPage'] | True | True | False | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Москва | Москва |
| 78 | 276101 | Женский | 2005-10-24 | Россия, Москва | Не знаю | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 27.11.2023 | 0 | 0 | 0 | 27.11.2023 | ['InfoDonor'] | True | True | False | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Москва | Москва |
| 80 | 276099 | Женский | 2009-06-21 | Не указано | Не указано | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 27.11.2023 | 0 | 0 | Не указано | Не указано | ['CardsMobile'] | True | True | False | False | False | False | False | 0 | нет | нет | Не указано | 0 | Не указано | Не указано | Не указано |
| 98 | 276081 | Женский | 2005-01-10 | Россия, Московская область, Одинцово | B(III) Rh+ | Положительный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 27.11.2023 | 0 | 0 | 0 | 27.11.2023 | [None] | True | True | False | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Московская область | Одинцово |
| 117 | 276062 | Женский | 2005-10-25 | Россия, Московская область, Щербинка | A(II) Rh+ | Не знаю | Да | Нет | Да | Да | Нет | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 27.11.2023 | 0 | 0 | Не указано | 28.11.2023 | ['MainPage'] | True | False | False | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Московская область | Щербинка |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 245972 | 120140 | Женский | 2011-10-01 | Россия, Московская область, Кашира | Не указано | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 09.04.2018 | 0 | 0 | Не указано | Не указано | [None] | True | True | True | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Московская область | Кашира |
| 247222 | 141101 | Женский | 2005-02-04 | Россия, Приморский край, Владивосток | B(III) Rh+ | Отрицательный | Да | Да | Да | Да | Да | Да | 03.04.2023 | Нет | 26 | 0 | 0 | 0 | 0 | 09.04.2018 | 19 | 26 | Не указано | 01.01.2023 | [None] | True | True | False | False | False | False | False | 26 | да | нет | Не указано | 8 | Россия | Приморский край | Владивосток |
| 247935 | 29034 | Мужской | 2008-03-10 | Россия, Санкт-Петербург | O(I) Rh+ | Отрицательный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 09.04.2018 | 1 | 0 | 20 | 25.10.2023 | [None] | True | False | True | False | False | False | False | 0 | нет | нет | 20 | 0 | Россия | Санкт-Петербург | Санкт-Петербург |
| 253877 | 23814 | Мужской | 2006-02-04 | Россия, Омская область, Омск | Не указано | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 09.04.2018 | 0 | 0 | Не указано | Не указано | [None] | False | True | True | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Омская область | Омск |
| 258781 | 19536 | Женский | 2011-04-25 | Россия, Москва | Не указано | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 09.04.2018 | 0 | 0 | Не указано | Не указано | [None] | True | True | True | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Москва | Москва |
1963 rows × 40 columns
df_us.query('дата_рождения< "1923-01-01 00:00:00"')
| id | пол | дата_рождения | регион | группа_крови | kell-фактор | цельная_кровь | плазма | тромбоциты | эритроциты | лейкоциты | костный_мозг | почетный_донор | отвод_от_донации | цельная_кровь_1 | плазма_1 | тромбоциты_1 | эритроциты_1 | лейкоциты_1 | дата_регистрации | не_подтверждённые_донации | прошедших_донаций | донаций_до_регистрации | последняя_активность | теги | указан_email | указан_телефон | авторизация_через_вк | авторизация_через_одноклассники | авторизация_через_твиттер | авторизация_через_яндекс | авторизация_через_гугл | подтверждённые_донации | получен_значок_20 | получен_значок_100 | донаций_на_момент_регистрации | количество_взятых_бонусов | страна | область | город | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 27563 | 247622 | Женский | 1902-07-24 | Украина, Кировоградская область, Кировоград | B(III) Rh+ | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 07.03.2023 | 0 | 0 | Не указано | 07.03.2023 | ['MainPage'] | True | False | False | False | False | False | True | 0 | нет | нет | Не указано | 0 | Украина | Кировоградская область | Кировоград |
| 50350 | 223560 | Женский | 1919-02-12 | Не указано | Не указано | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 01.10.2022 | 0 | 0 | Не указано | 01.10.2022 | [None] | True | False | False | False | False | True | False | 0 | нет | нет | Не указано | 0 | Не указано | Не указано | Не указано |
| 60419 | 212931 | Мужской | 1910-07-09 | Россия, Коми, Ухта | B(III) Rh- | Не указано | Да | Нет | Нет | Нет | Нет | Нет | 19.05.2024 | Нет | 2 | 0 | 0 | 0 | 0 | 28.07.2022 | 0 | 2 | Не указано | 27.10.2022 | ['MainPage'] | True | False | False | False | False | True | False | 2 | нет | нет | Не указано | 3 | Россия | Коми | Ухта |
| 67556 | 205351 | Мужской | 1900-12-21 | Не указано | Не указано | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 04.06.2022 | 0 | 0 | Не указано | Не указано | ['CardsMobile'] | True | True | False | False | False | False | False | 0 | нет | нет | Не указано | 0 | Не указано | Не указано | Не указано |
| 71447 | 201252 | Мужской | 1920-04-01 | Не указано | Не указано | Не указано | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 27.04.2022 | 0 | 0 | Не указано | 02.06.2022 | ['Bonus'] | True | False | False | False | False | True | False | 0 | нет | нет | Не указано | 0 | Не указано | Не указано | Не указано |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 146598 | 117127 | Женский | 1906-05-29 | Россия, Тверская область, Конаково | A(II) Rh+ | Отрицательный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 25.04.2018 | 0 | 0 | 10 | 02.07.2023 | [None] | True | False | True | False | False | False | False | 0 | нет | нет | 10 | 0 | Россия | Тверская область | Конаково |
| 146675 | 117051 | Мужской | 1918-07-10 | Не указано | Не указано | Положительный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 23.04.2018 | 0 | 0 | Не указано | Не указано | [None] | True | False | True | False | False | False | False | 0 | нет | нет | Не указано | 0 | Не указано | Не указано | Не указано |
| 147047 | 116605 | Женский | 1903-02-08 | Россия, Пермский край, Пермь | Не указано | Отрицательный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 13.04.2018 | 0 | 0 | Не указано | Не указано | [None] | True | False | True | False | False | False | False | 0 | нет | нет | Не указано | 0 | Россия | Пермский край | Пермь |
| 147048 | 116589 | Женский | 1905-12-15 | Не указано | Не указано | Отрицательный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 0 | 0 | 0 | 0 | 0 | 13.04.2018 | 0 | 0 | Не указано | Не указано | [None] | False | False | True | False | False | False | False | 0 | нет | нет | Не указано | 0 | Не указано | Не указано | Не указано |
| 213290 | 6692 | Женский | 1900-01-01 | Россия, Татарстан, Чистополь | AB(IV) Rh+ | Отрицательный | Да | Да | Да | Да | Да | Нет | Дата получения не известна | Нет | 2 | 0 | 0 | 0 | 0 | 09.04.2018 | 0 | 2 | Не указано | 15.01.2022 | [None] | True | True | True | False | False | False | False | 2 | нет | нет | Не указано | 0 | Россия | Татарстан | Чистополь |
171 rows × 40 columns
get_date_range_info(df_us,'дата_рождения')
'Данные представлены за период от 1888-09-22 00:00:00 до 2098-04-29 00:00:00, разница в 76555 days 00:00:00.'
df_us['возраст'] = ((pd.to_datetime('today').normalize() - df_us['дата_рождения'])/pd.Timedelta(365, 'D')).round()
df_us['возраст']
0 NaN
1 33.0
2 NaN
3 NaN
4 38.0
...
265831 NaN
265832 43.0
265833 NaN
265834 NaN
265835 NaN
Name: возраст, Length: 265836, dtype: float64
df_us['возраст'].min()
-74.0
df_us['возраст'].max()
135.0
df_us.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 265836 entries, 0 to 265835 Data columns (total 41 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 265836 non-null int64 1 пол 265836 non-null object 2 дата_рождения 96511 non-null datetime64[ns] 3 регион 265836 non-null object 4 группа_крови 265836 non-null object 5 kell-фактор 265836 non-null object 6 цельная_кровь 265836 non-null object 7 плазма 265836 non-null object 8 тромбоциты 265836 non-null object 9 эритроциты 265836 non-null object 10 лейкоциты 265836 non-null object 11 костный_мозг 265836 non-null object 12 почетный_донор 265836 non-null object 13 отвод_от_донации 265836 non-null object 14 цельная_кровь_1 265836 non-null int64 15 плазма_1 265836 non-null int64 16 тромбоциты_1 265836 non-null int64 17 эритроциты_1 265836 non-null int64 18 лейкоциты_1 265836 non-null int64 19 дата_регистрации 265836 non-null object 20 не_подтверждённые_донации 265836 non-null int64 21 прошедших_донаций 265836 non-null int64 22 донаций_до_регистрации 265836 non-null object 23 последняя_активность 265836 non-null object 24 теги 265836 non-null object 25 указан_email 265836 non-null bool 26 указан_телефон 265836 non-null bool 27 авторизация_через_вк 265836 non-null bool 28 авторизация_через_одноклассники 265836 non-null bool 29 авторизация_через_твиттер 265836 non-null bool 30 авторизация_через_яндекс 265836 non-null bool 31 авторизация_через_гугл 265836 non-null bool 32 подтверждённые_донации 265836 non-null int64 33 получен_значок_20 265836 non-null object 34 получен_значок_100 265836 non-null object 35 донаций_на_момент_регистрации 265836 non-null object 36 количество_взятых_бонусов 265836 non-null int64 37 страна 265836 non-null object 38 область 265836 non-null object 39 город 265836 non-null object 40 возраст 96511 non-null float64 dtypes: bool(7), datetime64[ns](1), float64(1), int64(10), object(22) memory usage: 70.7+ MB
df_us['возраст'].unique()
array([ nan, 33., 38., 47., 46., 23., 32., 28., 40., 22., 35.,
41., 21., 26., 44., 34., 27., 30., 45., 19., 18., 15.,
20., 25., 31., 24., 39., 36., 37., 29., 42., 17., 52.,
53., 43., 50., 59., 75., 51., 62., 57., 48., 56., 16.,
54., 13., 49., 60., 61., 68., 5., 55., 72., 66., 58.,
12., 11., 3., 8., 14., 10., 70., 64., 63., 67., 9.,
97., 4., 7., 6., 94., 96., 65., 69., 71., 84., 73.,
122., 81., 78., 74., 80., 76., 91., 95., 105., 93., 114.,
123., 79., 104., 77., 2., 87., 88., 124., 120., 113., 119.,
107., 92., 121., 115., 109., 118., 117., 98., 99., 102., 112.,
116., 85., 108., 83., 82., -74., 135., 106., 101., 103., 111.,
110., 86., 127.])
Данных о возрасте у нас около трети.Остальное пропуски.Создадим отдельный датафрейм со значениями по году.
df_us1 =df_us.dropna(subset=['возраст'])
удалим записи с возрастом меньше 18 лет и свыше 100 лет
df_us1 = df_us1.drop(df_us1[(df_us1['возраст'] <18.0) | (df_us1['возраст'] > 100.0)].index).reset_index()
df_us1.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 95063 entries, 0 to 95062 Data columns (total 42 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 index 95063 non-null int64 1 id 95063 non-null int64 2 пол 95063 non-null object 3 дата_рождения 95063 non-null datetime64[ns] 4 регион 95063 non-null object 5 группа_крови 95063 non-null object 6 kell-фактор 95063 non-null object 7 цельная_кровь 95063 non-null object 8 плазма 95063 non-null object 9 тромбоциты 95063 non-null object 10 эритроциты 95063 non-null object 11 лейкоциты 95063 non-null object 12 костный_мозг 95063 non-null object 13 почетный_донор 95063 non-null object 14 отвод_от_донации 95063 non-null object 15 цельная_кровь_1 95063 non-null int64 16 плазма_1 95063 non-null int64 17 тромбоциты_1 95063 non-null int64 18 эритроциты_1 95063 non-null int64 19 лейкоциты_1 95063 non-null int64 20 дата_регистрации 95063 non-null object 21 не_подтверждённые_донации 95063 non-null int64 22 прошедших_донаций 95063 non-null int64 23 донаций_до_регистрации 95063 non-null object 24 последняя_активность 95063 non-null object 25 теги 95063 non-null object 26 указан_email 95063 non-null bool 27 указан_телефон 95063 non-null bool 28 авторизация_через_вк 95063 non-null bool 29 авторизация_через_одноклассники 95063 non-null bool 30 авторизация_через_твиттер 95063 non-null bool 31 авторизация_через_яндекс 95063 non-null bool 32 авторизация_через_гугл 95063 non-null bool 33 подтверждённые_донации 95063 non-null int64 34 получен_значок_20 95063 non-null object 35 получен_значок_100 95063 non-null object 36 донаций_на_момент_регистрации 95063 non-null object 37 количество_взятых_бонусов 95063 non-null int64 38 страна 95063 non-null object 39 область 95063 non-null object 40 город 95063 non-null object 41 возраст 95063 non-null float64 dtypes: bool(7), datetime64[ns](1), float64(1), int64(11), object(22) memory usage: 26.0+ MB
df_us['kell-фактор'].value_counts()
Не указано 214116 Отрицательный 24981 Положительный 19596 Не знаю 7143 Name: kell-фактор, dtype: int64
df_us['группа_крови'].value_counts()
Не указано 212121 A(II) Rh+ 13797 O(I) Rh+ 13242 B(III) Rh+ 9039 AB(IV) Rh+ 4765 O(I) Rh- 3840 A(II) Rh- 3390 B(III) Rh- 2469 Не знаю 1602 AB(IV) Rh- 1571 Name: группа_крови, dtype: int64
df_us['группа_крови'].value_counts(normalize=True).round(4)*100
Не указано 79.79 A(II) Rh+ 5.19 O(I) Rh+ 4.98 B(III) Rh+ 3.40 AB(IV) Rh+ 1.79 O(I) Rh- 1.44 A(II) Rh- 1.28 B(III) Rh- 0.93 Не знаю 0.60 AB(IV) Rh- 0.59 Name: группа_крови, dtype: float64
df_us['почетный_донор'].value_counts(normalize=True).round(4)*100
Дата получения не известна 91.76
08.01.2023 0.82
Да 0.30
24.12.2022 0.27
09.12.2022 0.14
...
18.10.2026 0.00
16.12.2022 0.00
21.08.2026 0.00
06.10.2026 0.00
06.01.2022 0.00
Name: почетный_донор, Length: 1476, dtype: float64
df_us['почетный_донор'].unique()
array(['Дата получения не известна', '25.10.2026', '05.07.2025', ...,
'16.03.2023', '20.11.2022', '06.01.2022'], dtype=object)
df_us['отвод_от_донации'].value_counts(normalize=True).round(4)*100
Нет 99.54
01.02.2023 0.00
01.04.2023 0.00
01.06.2022 0.00
01.11.2022 0.00
...
03.09.2022 0.00
01.08.2100 0.00
21.09.2022 0.00
25.03.2023 0.00
08.06.2023 0.00
Name: отвод_от_донации, Length: 734, dtype: float64
df_us.дата_рождения.isna().mean()
0.6369528581531471
df_us['дата_регистрации'] = pd.to_datetime(df_us['дата_регистрации'],format='%d.%m.%Y',errors='coerce')
get_date_range_info(df_us,'дата_регистрации')
'Данные представлены за период от 2018-04-09 00:00:00 до 2023-11-28 00:00:00, разница в 2059 days 00:00:00.'
df_us['теги'].value_counts()
[None] 182655 ['CardsMobile'] 47202 ['MainPage'] 21687 ['Bonus'] 5385 ['Blood'] 3462 ['DirectSignUp'] 2873 ['Event'] 736 ['UnityEvents'] 579 ['Register'] 549 ['InfoDonor'] 233 ['Top'] 136 ['UnityOrganizations'] 98 ['Recipient'] 73 ['Helpme'] 44 ['InfoProject'] 39 ['Advice'] 26 ['2021'] 18 ['UnityMainPage'] 17 ['Organization'] 17 ['RedCross'] 4 ['AdviceAdvice'] 3 Name: теги, dtype: int64
df_us.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 265836 entries, 0 to 265835 Data columns (total 41 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 265836 non-null int64 1 пол 265836 non-null object 2 дата_рождения 96511 non-null datetime64[ns] 3 регион 265836 non-null object 4 группа_крови 265836 non-null object 5 kell-фактор 265836 non-null object 6 цельная_кровь 265836 non-null object 7 плазма 265836 non-null object 8 тромбоциты 265836 non-null object 9 эритроциты 265836 non-null object 10 лейкоциты 265836 non-null object 11 костный_мозг 265836 non-null object 12 почетный_донор 265836 non-null object 13 отвод_от_донации 265836 non-null object 14 цельная_кровь_1 265836 non-null int64 15 плазма_1 265836 non-null int64 16 тромбоциты_1 265836 non-null int64 17 эритроциты_1 265836 non-null int64 18 лейкоциты_1 265836 non-null int64 19 дата_регистрации 265836 non-null datetime64[ns] 20 не_подтверждённые_донации 265836 non-null int64 21 прошедших_донаций 265836 non-null int64 22 донаций_до_регистрации 265836 non-null object 23 последняя_активность 265836 non-null object 24 теги 265836 non-null object 25 указан_email 265836 non-null bool 26 указан_телефон 265836 non-null bool 27 авторизация_через_вк 265836 non-null bool 28 авторизация_через_одноклассники 265836 non-null bool 29 авторизация_через_твиттер 265836 non-null bool 30 авторизация_через_яндекс 265836 non-null bool 31 авторизация_через_гугл 265836 non-null bool 32 подтверждённые_донации 265836 non-null int64 33 получен_значок_20 265836 non-null object 34 получен_значок_100 265836 non-null object 35 донаций_на_момент_регистрации 265836 non-null object 36 количество_взятых_бонусов 265836 non-null int64 37 страна 265836 non-null object 38 область 265836 non-null object 39 город 265836 non-null object 40 возраст 96511 non-null float64 dtypes: bool(7), datetime64[ns](2), float64(1), int64(10), object(21) memory usage: 70.7+ MB
user_bonus_anon 281123.csv- данные о партнерах,бонусах для пользователей¶Бонусы, взятые пользователями
ID пользователя- Уникальный идентификатор донора.
Количество взятых бонусов- Количество бонусов, взятых пользователем за
все время существования сайта до момента выгрузки.
Количество донаций- Количество всех подтвержденных донаций
пользователя, информацию о которых он загрузил на сайт.
Название партнера Кто именно предоставил бонус.
Бонус- Название бонуса.
Дата использования- Дата, когда бонус был использован.
Город- Информация из профиля пользователя.
Регион- Информация из профиля пользователя.
Страна- Информация из профиля пользователя.
#Загрузка датасета
df_b = pd.read_csv(patch + 'user_bonus_anon 281123.csv')
df_b = inform(df_b)
| ID пользователя | Количество взятых бонусов | Количество донаций | Название партнера | Бонус | Дата использования | Страна | Регион | Город | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 229019 | 3 | 29 | Farfor | Пицца бесплатно на Farfor.ru | 28.11.2023 | Россия | Рязанская область | Рязань |
| 1 | 100457 | 5 | 4 | Farfor | Пицца бесплатно на Farfor.ru | 28.11.2023 | Россия | Крым | Керчь |
| 2 | 260830 | 3 | 4 | Farfor | Пицца бесплатно на Farfor.ru | 28.11.2023 | Россия | Смоленская область | Смоленск |
| 3 | 276082 | 1 | 1 | Farfor | Пицца бесплатно на Farfor.ru | 28.11.2023 | Россия | NaN | Москва |
| 4 | 275967 | 1 | 1 | Farfor | Пицца бесплатно на Farfor.ru | 28.11.2023 | Россия | Тульская область | Тула |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 21108 entries, 0 to 21107 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ID пользователя 21108 non-null int64 1 Количество взятых бонусов 21108 non-null int64 2 Количество донаций 21108 non-null int64 3 Название партнера 21108 non-null object 4 Бонус 21108 non-null object 5 Дата использования 21108 non-null object 6 Страна 21103 non-null object 7 Регион 15673 non-null object 8 Город 21103 non-null object dtypes: int64(3), object(6) memory usage: 1.4+ MB Количество дубликатов - 3 Число пропусков - ID пользователя 0 Количество взятых бонусов 0 Количество донаций 0 Название партнера 0 Бонус 0 Дата использования 0 Страна 5 Регион 5435 Город 5 dtype: int64 Доля пропусков - ID пользователя 0.000000 Количество взятых бонусов 0.000000 Количество донаций 0.000000 Название партнера 0.000000 Бонус 0.000000 Дата использования 0.000000 Страна 0.000237 Регион 0.257485 Город 0.000237 dtype: float64
| ID пользователя | Количество взятых бонусов | Количество донаций | |
|---|---|---|---|
| count | 21108.000000 | 21108.000000 | 21108.000000 |
| mean | 195070.372655 | 5.467406 | 13.892932 |
| std | 59450.480356 | 8.852402 | 21.955262 |
| min | 21.000000 | 1.000000 | 0.000000 |
| 25% | 169081.000000 | 2.000000 | 2.000000 |
| 50% | 203362.000000 | 3.000000 | 5.000000 |
| 75% | 234579.000000 | 6.000000 | 18.000000 |
| max | 276082.000000 | 87.000000 | 236.000000 |
df_b.columns = df_b.columns.str.lower().str.replace(' ', '_')
df_b.columns
Index(['id_пользователя', 'количество_взятых_бонусов', 'количество_донаций',
'название_партнера', 'бонус', 'дата_использования', 'страна', 'регион',
'город'],
dtype='object')
df_b.nunique()
id_пользователя 9345 количество_взятых_бонусов 34 количество_донаций 144 название_партнера 77 бонус 102 дата_использования 919 страна 8 регион 93 город 467 dtype: int64
df_b =df_b.drop_duplicates()
df_b[df_b['страна'].isnull()]
| id_пользователя | количество_взятых_бонусов | количество_донаций | название_партнера | бонус | дата_использования | страна | регион | город | |
|---|---|---|---|---|---|---|---|---|---|
| 5763 | 227549 | 3 | 3 | Яндекс Плюс | 2 месяца подписки Яндекс Плюс бесплатно | 29.03.2023 | NaN | NaN | NaN |
| 11547 | 224215 | 1 | 1 | Farfor | Пицца бесплатно на Farfor.ru | 06.10.2022 | NaN | NaN | NaN |
| 14962 | 227549 | 3 | 3 | Ozon | Подписка Ozon Premium на 1 месяц | 27.10.2022 | NaN | NaN | NaN |
| 18203 | 193542 | 1 | 0 | Другое Дело | 6000 баллов на платформе Другое Дело | 30.03.2022 | NaN | NaN | NaN |
| 20502 | 227549 | 3 | 3 | Lamoda | -15% на товары | 03.11.2022 | NaN | NaN | NaN |
df_b1 = df_b[df_b['регион'].isnull()]
df_b1
| id_пользователя | количество_взятых_бонусов | количество_донаций | название_партнера | бонус | дата_использования | страна | регион | город | |
|---|---|---|---|---|---|---|---|---|---|
| 3 | 276082 | 1 | 1 | Farfor | Пицца бесплатно на Farfor.ru | 28.11.2023 | Россия | NaN | Москва |
| 15 | 153133 | 1 | 5 | Farfor | Пицца бесплатно на Farfor.ru | 27.11.2023 | Россия | NaN | Москва |
| 32 | 153304 | 10 | 43 | Farfor | Пицца бесплатно на Farfor.ru | 26.11.2023 | Россия | NaN | Москва |
| 33 | 262206 | 2 | 4 | Farfor | Пицца бесплатно на Farfor.ru | 26.11.2023 | Россия | NaN | Москва |
| 37 | 159851 | 5 | 30 | Farfor | Пицца бесплатно на Farfor.ru | 26.11.2023 | Россия | NaN | Москва |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 21100 | 144038 | 1 | 2 | 4Fresh | -10% на весь ассортимент | 27.10.2021 | Россия | NaN | Санкт-Петербург |
| 21102 | 168414 | 6 | 1 | 4Fresh | -10% на весь ассортимент | 08.10.2021 | Россия | NaN | Санкт-Петербург |
| 21105 | 361 | 1 | 3 | 4Fresh | -10% на весь ассортимент | 17.01.2021 | Россия | NaN | Москва |
| 21106 | 137181 | 1 | 3 | 4Fresh | -10% на весь ассортимент | 04.01.2021 | Россия | NaN | Москва |
| 21107 | 149115 | 2 | 46 | 4Fresh | -10% на весь ассортимент | 30.12.2020 | Россия | NaN | Москва |
5433 rows × 9 columns
df_b1.город.value_counts()
Москва 4037 Санкт-Петербург 1375 Алма-Ата 8 Тирасполь 4 Ташкент 3 Бишкек 1 Name: город, dtype: int64
df_b1.страна.value_counts()
Россия 5412 Казахстан 8 Молдова 4 Узбекистан 3 Кыргызстан 1 Name: страна, dtype: int64
df_b.query('город =="Алма-Ата"')
| id_пользователя | количество_взятых_бонусов | количество_донаций | название_партнера | бонус | дата_использования | страна | регион | город | |
|---|---|---|---|---|---|---|---|---|---|
| 4851 | 184424 | 8 | 20 | Flowwow | Скидка 15% на весь ассортимент Flowwow | 13.10.2023 | Казахстан | NaN | Алма-Ата |
| 13951 | 184424 | 8 | 20 | Квиз Эйнштейн Party | Бесплатная домашняя игра от Эйнштейн Party | 23.06.2022 | Казахстан | NaN | Алма-Ата |
| 16776 | 184424 | 8 | 20 | Яндекс Плюс | 2 месяца подписки Яндекс Плюс бесплатно | 26.04.2022 | Казахстан | NaN | Алма-Ата |
| 17875 | 184424 | 8 | 20 | Альпина Паблишер | Книга "Пять литров красного" в подарок | 24.03.2022 | Казахстан | NaN | Алма-Ата |
| 18308 | 184424 | 8 | 20 | Ozon | Подписка Ozon Premium на 1 месяц | 13.04.2022 | Казахстан | NaN | Алма-Ата |
| 19113 | 184424 | 8 | 20 | МИФ | Книга в подарок - Не сходите с ума на работе | 26.01.2022 | Казахстан | NaN | Алма-Ата |
| 19294 | 184424 | 8 | 20 | МИФ | Книга в подарок - Мифы о диетах | 26.01.2022 | Казахстан | NaN | Алма-Ата |
| 19602 | 184424 | 8 | 20 | МИФ | Книга в подарок - Заряжен на 100% | 26.01.2022 | Казахстан | NaN | Алма-Ата |
df_b.query('город =="Тирасполь"')
| id_пользователя | количество_взятых_бонусов | количество_донаций | название_партнера | бонус | дата_использования | страна | регион | город | |
|---|---|---|---|---|---|---|---|---|---|
| 14429 | 153937 | 4 | 12 | Arzamas | 1 месяц подписки Arzamas в подарок | 05.09.2022 | Молдова | NaN | Тирасполь |
| 16456 | 153937 | 4 | 12 | Яндекс Плюс | 2 месяца подписки Яндекс Плюс бесплатно | 29.04.2022 | Молдова | NaN | Тирасполь |
| 20282 | 153937 | 4 | 12 | More.TV | 45 дней подписки в подарок | 29.04.2022 | Молдова | NaN | Тирасполь |
| 20954 | 153937 | 4 | 12 | Skyeng | 3 бесплатных урока английского языка | 14.12.2021 | Молдова | NaN | Тирасполь |
df_b.query('город =="Ташкент"')
| id_пользователя | количество_взятых_бонусов | количество_донаций | название_партнера | бонус | дата_использования | страна | регион | город | |
|---|---|---|---|---|---|---|---|---|---|
| 2594 | 225620 | 3 | 4 | Веганский магазин Веги Вуги | 300 рублей на заказы из Веги Вуги | 24.10.2023 | Узбекистан | NaN | Ташкент |
| 11106 | 225620 | 3 | 4 | МИФ | Книга от МИФ "Заряжен на 100%" - в подарок | 15.10.2022 | Узбекистан | NaN | Ташкент |
| 12257 | 225620 | 3 | 4 | Bookmate | 3 месяца бесплатной подписки | 15.10.2022 | Узбекистан | NaN | Ташкент |
df_b.query('город =="Бишкек"')
| id_пользователя | количество_взятых_бонусов | количество_донаций | название_партнера | бонус | дата_использования | страна | регион | город | |
|---|---|---|---|---|---|---|---|---|---|
| 20897 | 154852 | 1 | 4 | Lamoda | -15% на товары | 18.05.2021 | Кыргызстан | NaN | Бишкек |
df_b.loc[df_b['город'] == 'Москва', 'регион'] = 'Москва'
df_b.loc[df_b['город'] == 'Санкт-Петербург', 'регион'] = 'Санкт-Петербург'
df_b.loc[df_b['город'] == 'Алма-Ата', 'регион'] = 'Алма-Ата'
df_b.loc[df_b['город'] == 'Тирасполь', 'регион'] = 'Тирасполь'
df_b.loc[df_b['город'] == 'Ташкент', 'регион'] = 'Ташкент'
df_b.loc[df_b['город'] == 'Бишкек', 'регион'] = 'Бишкек'
df_b[['регион','город','страна']] = df_b[['регион','город','страна']].fillna('неизвестно')
df_b.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 21105 entries, 0 to 21107 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id_пользователя 21105 non-null int64 1 количество_взятых_бонусов 21105 non-null int64 2 количество_донаций 21105 non-null int64 3 название_партнера 21105 non-null object 4 бонус 21105 non-null object 5 дата_использования 21105 non-null object 6 страна 21105 non-null object 7 регион 21105 non-null object 8 город 21105 non-null object dtypes: int64(3), object(6) memory usage: 1.6+ MB
df_b.groupby('дата_использования').size()
дата_использования
01.01.2022 2
01.01.2023 1
01.02.2021 2
01.02.2022 6
01.02.2023 22
..
31.10.2022 59
31.10.2023 26
31.12.2021 2
31.12.2022 2
Не указано 13
Length: 919, dtype: int64
df_b['дата_использования'] = pd.to_datetime(df_b['дата_использования'],format='%d.%m.%Y',errors='coerce')
get_date_range_info(df_b,'дата_использования')
'Данные представлены за период от 2020-12-29 00:00:00 до 2023-11-28 00:00:00, разница в 1064 days 00:00:00.'
предобработаны названия колонок,столбец с датой рождения,удалены дубликаты
дату рождения указали лишь 36% пользователей.Создан отдельный столбец с возрастом.
создана отдельная таблица с фильтром по возрасту от 18 до 100 лет.можно проанализировать возраст доноров
в целом таблицу пользователей можно анализировать на предмет распределения по полу,счаче компонентов, типу регистрации,городам и т.п.В таблице данные по регистрациям с 2018-04-09 до 2023-11-28.
можно объединять эти 2 таблицы по id и смотреть влияние акций на донации за период от 2020-12-29 до 2023-11-28
В столбцах 'почетный донор' и 'отвод_от_донации' слишком мало конкретной информации
profile_activity 281123.csv- Показы банеров справа на сайте “где сдать кровь?”¶ДАТА- Дата показа банеров.
ОБЩЕЕ КОЛ-ВО ПОКАЗОВ- Общее количество показов всех банеров.
В следующих колонках отмечено какие банеры показывали пользователям:
ПРЕДСТОЯЩЕЕ МЕРОПРИЯТИЕ
ПОТРЕБНОСТЬ ЦК
АДРЕСНАЯ ПОТРЕБНОСТЬ
УКАЖИТЕ ГОРОД
#Загрузка датасета
df_pa = pd.read_csv(patch + 'profile_activity 281123.csv',sep=",")
df_pa = inform(df_pa)
| ДАТА | ОБЩЕЕ КОЛ-ВО ПОКАЗОВ | ПРЕДСТОЯЩЕЕ МЕРОПРИЯТИЕ | ПОТРЕБНОСТЬ ЦК | АДРЕСНАЯ ПОТРЕБНОСТЬ | УКАЖИТЕ ГОРОД | СТАТЬИ ЖУРНАЛА | |
|---|---|---|---|---|---|---|---|
| 0 | 2023-11-28 | 686 | 134 | 396 | 12 | 62 | 82 |
| 1 | 2023-11-27 | 1293 | 111 | 759 | 124 | 88 | 211 |
| 2 | 2023-11-26 | 820 | 89 | 468 | 98 | 72 | 93 |
| 3 | 2023-11-25 | 990 | 71 | 656 | 89 | 77 | 97 |
| 4 | 2023-11-24 | 1283 | 132 | 771 | 133 | 74 | 173 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 153 entries, 0 to 152 Data columns (total 7 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ДАТА 153 non-null object 1 ОБЩЕЕ КОЛ-ВО ПОКАЗОВ 153 non-null int64 2 ПРЕДСТОЯЩЕЕ МЕРОПРИЯТИЕ 153 non-null int64 3 ПОТРЕБНОСТЬ ЦК 153 non-null int64 4 АДРЕСНАЯ ПОТРЕБНОСТЬ 153 non-null int64 5 УКАЖИТЕ ГОРОД 153 non-null int64 6 СТАТЬИ ЖУРНАЛА 153 non-null int64 dtypes: int64(6), object(1) memory usage: 8.5+ KB Количество дубликатов - 0 Число пропусков - ДАТА 0 ОБЩЕЕ КОЛ-ВО ПОКАЗОВ 0 ПРЕДСТОЯЩЕЕ МЕРОПРИЯТИЕ 0 ПОТРЕБНОСТЬ ЦК 0 АДРЕСНАЯ ПОТРЕБНОСТЬ 0 УКАЖИТЕ ГОРОД 0 СТАТЬИ ЖУРНАЛА 0 dtype: int64 Доля пропусков - ДАТА 0.0 ОБЩЕЕ КОЛ-ВО ПОКАЗОВ 0.0 ПРЕДСТОЯЩЕЕ МЕРОПРИЯТИЕ 0.0 ПОТРЕБНОСТЬ ЦК 0.0 АДРЕСНАЯ ПОТРЕБНОСТЬ 0.0 УКАЖИТЕ ГОРОД 0.0 СТАТЬИ ЖУРНАЛА 0.0 dtype: float64
| ОБЩЕЕ КОЛ-ВО ПОКАЗОВ | ПРЕДСТОЯЩЕЕ МЕРОПРИЯТИЕ | ПОТРЕБНОСТЬ ЦК | АДРЕСНАЯ ПОТРЕБНОСТЬ | УКАЖИТЕ ГОРОД | СТАТЬИ ЖУРНАЛА | |
|---|---|---|---|---|---|---|
| count | 153.000000 | 153.000000 | 153.000000 | 153.000000 | 153.000000 | 153.000000 |
| mean | 1270.176471 | 55.117647 | 844.339869 | 60.980392 | 121.627451 | 187.803922 |
| std | 372.671263 | 60.501625 | 254.838601 | 36.612025 | 49.715359 | 67.245823 |
| min | 548.000000 | 0.000000 | 342.000000 | 4.000000 | 49.000000 | 65.000000 |
| 25% | 1003.000000 | 0.000000 | 642.000000 | 35.000000 | 85.000000 | 141.000000 |
| 50% | 1283.000000 | 42.000000 | 851.000000 | 52.000000 | 109.000000 | 185.000000 |
| 75% | 1461.000000 | 96.000000 | 1010.000000 | 79.000000 | 140.000000 | 218.000000 |
| max | 2865.000000 | 211.000000 | 2082.000000 | 217.000000 | 274.000000 | 427.000000 |
df_pa.columns = df_pa.columns.str.lower().str.replace(' ', '_')
df_pa.columns
Index(['дата', 'общее_кол-во_показов', 'предстоящее_мероприятие',
'потребность_цк', 'адресная_потребность', 'укажите_город',
'статьи_журнала'],
dtype='object')
df_pa['дата'] = df_pa['дата'].str.replace('\n', '')
df_pa['дата'] = pd.to_datetime(df_pa['дата'],errors='coerce')
get_date_range_info(df_pa,'дата')
'Данные представлены за период от 2023-06-29 00:00:00 до 2023-11-28 00:00:00, разница в 152 days 00:00:00.'
df_pa['дата']
0 2023-11-28
1 2023-11-27
2 2023-11-26
3 2023-11-25
4 2023-11-24
...
148 2023-07-03
149 2023-07-02
150 2023-07-01
151 2023-06-30
152 2023-06-29
Name: дата, Length: 153, dtype: datetime64[ns]
profile_planned_donations 281123.csv- профили планируемых донаций¶#Загрузка датасета
df_ppd = pd.read_csv(patch + 'profile_planned_donations 281123.csv')
df_ppd = inform(df_ppd)
| ДАТА | ОБЩЕЕ КОЛ-ВО ПОКАЗОВ | НОВАЯ ДОНАЦИЯ | ДОНАЦИЯ ЗАПЛАНИРОВАНА | ПЛАНИРОВАЛИ СДАТЬ | |
|---|---|---|---|---|---|
| 0 | 2023-11-28 | 681 | 533 | 123 | 25 |
| 1 | 2023-11-27 | 1284 | 1024 | 227 | 33 |
| 2 | 2023-11-26 | 810 | 687 | 99 | 24 |
| 3 | 2023-11-25 | 976 | 780 | 152 | 44 |
| 4 | 2023-11-24 | 1275 | 1038 | 162 | 75 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 153 entries, 0 to 152 Data columns (total 5 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ДАТА 153 non-null object 1 ОБЩЕЕ КОЛ-ВО ПОКАЗОВ 153 non-null int64 2 НОВАЯ ДОНАЦИЯ 153 non-null int64 3 ДОНАЦИЯ ЗАПЛАНИРОВАНА 153 non-null int64 4 ПЛАНИРОВАЛИ СДАТЬ 153 non-null int64 dtypes: int64(4), object(1) memory usage: 6.1+ KB Количество дубликатов - 0 Число пропусков - ДАТА 0 ОБЩЕЕ КОЛ-ВО ПОКАЗОВ 0 НОВАЯ ДОНАЦИЯ 0 ДОНАЦИЯ ЗАПЛАНИРОВАНА 0 ПЛАНИРОВАЛИ СДАТЬ 0 dtype: int64 Доля пропусков - ДАТА 0.0 ОБЩЕЕ КОЛ-ВО ПОКАЗОВ 0.0 НОВАЯ ДОНАЦИЯ 0.0 ДОНАЦИЯ ЗАПЛАНИРОВАНА 0.0 ПЛАНИРОВАЛИ СДАТЬ 0.0 dtype: float64
| ОБЩЕЕ КОЛ-ВО ПОКАЗОВ | НОВАЯ ДОНАЦИЯ | ДОНАЦИЯ ЗАПЛАНИРОВАНА | ПЛАНИРОВАЛИ СДАТЬ | |
|---|---|---|---|---|
| count | 153.000000 | 153.000000 | 153.000000 | 153.000000 |
| mean | 1253.686275 | 994.477124 | 223.758170 | 35.450980 |
| std | 366.727894 | 293.195666 | 80.016037 | 14.418985 |
| min | 544.000000 | 427.000000 | 83.000000 | 12.000000 |
| 25% | 981.000000 | 793.000000 | 162.000000 | 24.000000 |
| 50% | 1274.000000 | 1003.000000 | 220.000000 | 34.000000 |
| 75% | 1456.000000 | 1161.000000 | 268.000000 | 44.000000 |
| max | 2818.000000 | 2393.000000 | 490.000000 | 88.000000 |
df_ppd.columns = df_ppd.columns.str.lower().str.replace(' ', '_').str.replace('.', '_')
df_ppd.columns
Index(['дата', 'общее_кол-во_показов', 'новая_донация',
'донация_запланирована', 'планировали_сдать'],
dtype='object')
df_ppd['дата'] = pd.to_datetime(df_ppd['дата'],errors='coerce')
get_date_range_info(df_ppd,'дата')
'Данные представлены за период от 2023-06-29 00:00:00 до 2023-11-28 00:00:00, разница в 152 days 00:00:00.'
profile_settings_upd 281123.csv- Показы банеров слева на сайте (на заполнение профиля)¶ДАТА- Дата изменений.
ПРОСМОТРОВ ПРОФИЛЯ- Всего просмотров профиля в этот день.
В следующих колонках отмечено какие поля предлагали заполнить:
USERNAME
EMAIL
ТЕЛЕФОН
ФАМИЛИЯ
ИМЯ
ОТЧЕСТВО
ДЕВИЧЬЯ ФАМИЛИЯ
ДАТА РОЖДЕНИЯ
ГР.КР.
ПОЛ
О СЕБЕ
ГОРОД
#Загрузка датасета
df_psu = pd.read_csv(patch + 'profile_settings_upd 281123.csv')
df_psu = inform(df_psu)
| ДАТА | ПРОСМОТРОВ ПРОФИЛЯ | USERNAME | ТЕЛЕФОН | ФАМИЛИЯ | ИМЯ | ОТЧЕСТВО | ДЕВИЧЬЯ ФАМИЛИЯ | ДАТА РОЖДЕНИЯ | ГР.КР. | ПОЛ | О СЕБЕ | ГОРОД | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2023-11-28 | 673 | 0 | 8 | 13 | 8 | 3 | 18 | 1 | 3 | 36 | 3 | 2 | 16 |
| 1 | 2023-11-27 | 1273 | 6 | 21 | 20 | 22 | 7 | 37 | 9 | 18 | 73 | 15 | 4 | 29 |
| 2 | 2023-11-26 | 801 | 2 | 3 | 16 | 11 | 5 | 20 | 1 | 7 | 38 | 7 | 2 | 22 |
| 3 | 2023-11-25 | 972 | 2 | 8 | 17 | 13 | 3 | 25 | 3 | 6 | 50 | 6 | 2 | 23 |
| 4 | 2023-11-24 | 1266 | 3 | 10 | 14 | 16 | 3 | 27 | 1 | 6 | 62 | 7 | 3 | 21 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 240 entries, 0 to 239 Data columns (total 14 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ДАТА 240 non-null object 1 ПРОСМОТРОВ ПРОФИЛЯ 240 non-null int64 2 USERNAME 240 non-null int64 3 EMAIL 240 non-null int64 4 ТЕЛЕФОН 240 non-null int64 5 ФАМИЛИЯ 240 non-null int64 6 ИМЯ 240 non-null int64 7 ОТЧЕСТВО 240 non-null int64 8 ДЕВИЧЬЯ ФАМИЛИЯ 240 non-null int64 9 ДАТА РОЖДЕНИЯ 240 non-null int64 10 ГР.КР. 240 non-null int64 11 ПОЛ 240 non-null int64 12 О СЕБЕ 240 non-null int64 13 ГОРОД 240 non-null int64 dtypes: int64(13), object(1) memory usage: 26.4+ KB Количество дубликатов - 0 Число пропусков - ДАТА 0 ПРОСМОТРОВ ПРОФИЛЯ 0 USERNAME 0 EMAIL 0 ТЕЛЕФОН 0 ФАМИЛИЯ 0 ИМЯ 0 ОТЧЕСТВО 0 ДЕВИЧЬЯ ФАМИЛИЯ 0 ДАТА РОЖДЕНИЯ 0 ГР.КР. 0 ПОЛ 0 О СЕБЕ 0 ГОРОД 0 dtype: int64 Доля пропусков - ДАТА 0.0 ПРОСМОТРОВ ПРОФИЛЯ 0.0 USERNAME 0.0 EMAIL 0.0 ТЕЛЕФОН 0.0 ФАМИЛИЯ 0.0 ИМЯ 0.0 ОТЧЕСТВО 0.0 ДЕВИЧЬЯ ФАМИЛИЯ 0.0 ДАТА РОЖДЕНИЯ 0.0 ГР.КР. 0.0 ПОЛ 0.0 О СЕБЕ 0.0 ГОРОД 0.0 dtype: float64
| ПРОСМОТРОВ ПРОФИЛЯ | USERNAME | ТЕЛЕФОН | ФАМИЛИЯ | ИМЯ | ОТЧЕСТВО | ДЕВИЧЬЯ ФАМИЛИЯ | ДАТА РОЖДЕНИЯ | ГР.КР. | ПОЛ | О СЕБЕ | ГОРОД | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 240.000000 | 240.000000 | 240.000000 | 240.000000 | 240.000000 | 240.000000 | 240.000000 | 240.000000 | 240.000000 | 240.000000 | 240.000000 | 240.00000 | 240.000000 |
| mean | 1271.404167 | 3.754167 | 24.450000 | 16.229167 | 16.554167 | 5.875000 | 28.537500 | 3.329167 | 12.595833 | 43.175000 | 12.379167 | 3.31250 | 25.708333 |
| std | 382.871346 | 2.776542 | 16.387999 | 11.519021 | 9.143051 | 3.667253 | 18.129204 | 2.313319 | 7.039576 | 40.612808 | 7.249440 | 2.56755 | 14.533986 |
| min | 535.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 2.000000 | 0.000000 | 1.000000 | 0.000000 | 1.000000 | 0.00000 | 2.000000 |
| 25% | 981.250000 | 2.000000 | 11.000000 | 7.000000 | 10.000000 | 3.000000 | 14.000000 | 1.000000 | 8.000000 | 0.000000 | 8.000000 | 2.00000 | 15.000000 |
| 50% | 1267.000000 | 3.000000 | 21.000000 | 15.500000 | 15.000000 | 5.000000 | 26.500000 | 3.000000 | 11.000000 | 48.000000 | 10.000000 | 3.00000 | 24.000000 |
| 75% | 1487.250000 | 5.000000 | 33.250000 | 23.250000 | 22.000000 | 7.250000 | 38.000000 | 5.000000 | 16.000000 | 70.000000 | 16.000000 | 5.00000 | 33.250000 |
| max | 2802.000000 | 18.000000 | 76.000000 | 63.000000 | 52.000000 | 20.000000 | 110.000000 | 11.000000 | 41.000000 | 179.000000 | 43.000000 | 17.00000 | 81.000000 |
df_psu.columns = df_psu.columns.str.lower().str.replace(' ', '_').str.replace('.', '_')
df_psu.columns
Index(['дата', 'просмотров_профиля', 'username', 'email', 'телефон', 'фамилия',
'имя', 'отчество', 'девичья_фамилия', 'дата_рождения', 'гр_кр_', 'пол',
'о_себе', 'город'],
dtype='object')
df_psu =df_psu.rename(columns = {'гр_кр_':'гр_кр'})
df_psu.columns
Index(['дата', 'просмотров_профиля', 'username', 'email', 'телефон', 'фамилия',
'имя', 'отчество', 'девичья_фамилия', 'дата_рождения', 'гр_кр', 'пол',
'о_себе', 'город'],
dtype='object')
#Приведение даты в нужный вид
df_psu['дата'] = df_psu['дата'].str.replace('\n', '')
df_psu['дата'] = pd.to_datetime(df_psu['дата'],errors='coerce')
get_date_range_info(df_psu,'дата')
'Данные представлены за период от 2023-04-03 00:00:00 до 2023-11-28 00:00:00, разница в 239 days 00:00:00.'
profile_trigger 281123.csv - Счетчик результативности доноров.¶ДАТА Дата изменений.
Сколько банеров показали и сколько изменений сделали пользователи
(необязательно пользователи внесли изменения в результате показа банера).
ОБЩ. КОЛ-ВО ПРОСМ-Всего просмотров профиля в этот день.
ВСЕ ЗАПОЛНЕНО
EMAIL
ОБН. EMAIL
ТЕЛ.
ОБН. ТЕЛ.
ГР. КР.
ОБН. ГР. КР.
ФАМ.
ОБН. ФАМ.
ИМЯ
ОБН. ИМЯ
ОТЧ-ВО
ОБН. ОТЧ-ВО
#Загрузка датасета
df_pf = pd.read_csv(patch + 'profile_trigger 281123.csv')
df_pf = inform(df_pf)
| ДАТА | ОБЩ. КОЛ-ВО ПРОСМ | ВСЕ ЗАПОЛНЕНО | ОБН. EMAIL | ТЕЛ. | ОБН. ТЕЛ. | ГР. КР. | ОБН. ГР. КР. | ФАМ. | ОБН. ФАМ. | ИМЯ | ОБН. ИМЯ | ОТЧ-ВО | ОБН. ОТЧ-ВО | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2023-11-28 | 797 | 495 | 47 | 8 | 46 | 13 | 54 | 36 | 12 | 8 | 0 | 3 | 30 | 18 |
| 1 | 2023-11-27 | 1531 | 944 | 94 | 21 | 57 | 20 | 84 | 73 | 36 | 22 | 2 | 7 | 64 | 37 |
| 2 | 2023-11-26 | 936 | 547 | 78 | 3 | 53 | 16 | 38 | 38 | 22 | 11 | 1 | 5 | 39 | 20 |
| 3 | 2023-11-25 | 1117 | 634 | 203 | 8 | 62 | 17 | 68 | 50 | 20 | 13 | 4 | 3 | 45 | 25 |
| 4 | 2023-11-24 | 1471 | 870 | 116 | 10 | 111 | 14 | 91 | 62 | 32 | 16 | 1 | 3 | 62 | 27 |
<class 'pandas.core.frame.DataFrame'> RangeIndex: 153 entries, 0 to 152 Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 ДАТА 153 non-null object 1 ОБЩ. КОЛ-ВО ПРОСМ 153 non-null int64 2 ВСЕ ЗАПОЛНЕНО 153 non-null int64 3 EMAIL 153 non-null int64 4 ОБН. EMAIL 153 non-null int64 5 ТЕЛ. 153 non-null int64 6 ОБН. ТЕЛ. 153 non-null int64 7 ГР. КР. 153 non-null int64 8 ОБН. ГР. КР. 153 non-null int64 9 ФАМ. 153 non-null int64 10 ОБН. ФАМ. 153 non-null int64 11 ИМЯ 153 non-null int64 12 ОБН. ИМЯ 153 non-null int64 13 ОТЧ-ВО 153 non-null int64 14 ОБН. ОТЧ-ВО 153 non-null int64 dtypes: int64(14), object(1) memory usage: 18.1+ KB Количество дубликатов - 0 Число пропусков - ДАТА 0 ОБЩ. КОЛ-ВО ПРОСМ 0 ВСЕ ЗАПОЛНЕНО 0 EMAIL 0 ОБН. EMAIL 0 ТЕЛ. 0 ОБН. ТЕЛ. 0 ГР. КР. 0 ОБН. ГР. КР. 0 ФАМ. 0 ОБН. ФАМ. 0 ИМЯ 0 ОБН. ИМЯ 0 ОТЧ-ВО 0 ОБН. ОТЧ-ВО 0 dtype: int64 Доля пропусков - ДАТА 0.0 ОБЩ. КОЛ-ВО ПРОСМ 0.0 ВСЕ ЗАПОЛНЕНО 0.0 EMAIL 0.0 ОБН. EMAIL 0.0 ТЕЛ. 0.0 ОБН. ТЕЛ. 0.0 ГР. КР. 0.0 ОБН. ГР. КР. 0.0 ФАМ. 0.0 ОБН. ФАМ. 0.0 ИМЯ 0.0 ОБН. ИМЯ 0.0 ОТЧ-ВО 0.0 ОБН. ОТЧ-ВО 0.0 dtype: float64
| ОБЩ. КОЛ-ВО ПРОСМ | ВСЕ ЗАПОЛНЕНО | ОБН. EMAIL | ТЕЛ. | ОБН. ТЕЛ. | ГР. КР. | ОБН. ГР. КР. | ФАМ. | ОБН. ФАМ. | ИМЯ | ОБН. ИМЯ | ОТЧ-ВО | ОБН. ОТЧ-ВО | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 153.000000 | 153.000000 | 153.000000 | 153.000000 | 153.000000 | 153.000000 | 153.000000 | 153.000000 | 153.000000 | 153.000000 | 153.000000 | 153.000000 | 153.000000 | 153.000000 |
| mean | 1514.437908 | 850.718954 | 134.660131 | 31.758170 | 100.915033 | 22.555556 | 100.588235 | 67.725490 | 33.000000 | 20.196078 | 2.241830 | 5.464052 | 74.098039 | 37.594771 |
| std | 457.909234 | 249.991170 | 48.324447 | 15.736325 | 40.052260 | 9.612826 | 37.595935 | 30.328733 | 14.123515 | 8.751736 | 1.788215 | 3.126765 | 30.858285 | 16.190250 |
| min | 643.000000 | 366.000000 | 43.000000 | 3.000000 | 42.000000 | 5.000000 | 38.000000 | 0.000000 | 9.000000 | 5.000000 | 0.000000 | 1.000000 | 27.000000 | 11.000000 |
| 25% | 1161.000000 | 635.000000 | 101.000000 | 21.000000 | 68.000000 | 16.000000 | 78.000000 | 50.000000 | 23.000000 | 15.000000 | 1.000000 | 3.000000 | 52.000000 | 27.000000 |
| 50% | 1528.000000 | 874.000000 | 128.000000 | 30.000000 | 96.000000 | 21.000000 | 96.000000 | 65.000000 | 30.000000 | 18.000000 | 2.000000 | 5.000000 | 69.000000 | 34.000000 |
| 75% | 1764.000000 | 999.000000 | 163.000000 | 41.000000 | 121.000000 | 28.000000 | 116.000000 | 79.000000 | 40.000000 | 23.000000 | 3.000000 | 7.000000 | 87.000000 | 44.000000 |
| max | 3365.000000 | 1967.000000 | 271.000000 | 76.000000 | 267.000000 | 63.000000 | 278.000000 | 179.000000 | 89.000000 | 52.000000 | 8.000000 | 19.000000 | 190.000000 | 110.000000 |
df_pf.columns = df_pf.columns.str.lower().str.replace(' ', '_').str.replace('.', '')
df_pf.columns
Index(['дата', 'общ_кол-во_просм', 'все_заполнено', 'email', 'обн_email',
'тел', 'обн_тел', 'гр_кр', 'обн_гр_кр', 'фам', 'обн_фам', 'имя',
'обн_имя', 'отч-во', 'обн_отч-во'],
dtype='object')
#Приведение даты в нужный вид
df_pf['дата'] = df_pf['дата'].str.replace('\n', '')
df_pf['дата'] = pd.to_datetime(df_pf['дата'],errors='coerce')
get_date_range_info(df_pf,'дата')
'Данные представлены за период от 2023-06-29 00:00:00 до 2023-11-28 00:00:00, разница в 152 days 00:00:00.'
df_pf.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 153 entries, 0 to 152 Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 дата 153 non-null datetime64[ns] 1 общ_кол-во_просм 153 non-null int64 2 все_заполнено 153 non-null int64 3 email 153 non-null int64 4 обн_email 153 non-null int64 5 тел 153 non-null int64 6 обн_тел 153 non-null int64 7 гр_кр 153 non-null int64 8 обн_гр_кр 153 non-null int64 9 фам 153 non-null int64 10 обн_фам 153 non-null int64 11 имя 153 non-null int64 12 обн_имя 153 non-null int64 13 отч-во 153 non-null int64 14 обн_отч-во 153 non-null int64 dtypes: datetime64[ns](1), int64(14) memory usage: 18.1 KB
Данные по ротациям баннеров представлены с 2023-06-29 по 2023-11-28.(в файле profile_settings_upd 281123.csv - с 03.04.2023)
Предобработка заключалась только в переименовании колонок и обработки дат.
Можно оценить в динамике за 3 последних месяца поведение пользователей по заполнению данных в личных кабинетах и обновлению информации
Эффективность баннеров в динамике по датам в связи с лентой событий и донациями
Здесь находится код выгружающий подготовленный для дашборда датасет + сторонний датасет объединенный с подготовленным в котором содержатся геоданные о точках донации.
Геоданные взяты за 2019 год, файл имеет показатель населения городов точно соответствующий переписи населения на 2019 год. На данный момент он предоставляет лишь примерное понимание картины с населением в стране, эти цифры могут отличаться от настоящего количества людей в той или иной области. Прошу принимать это во внимание при анализе работы. Однако, перепись производится раз в 10 лет по официальной информации, а это значит что данные не утратили актуальность.
#Файл с координатами городов РФ
#Датасет с геоданными (будет приложен на диск)
coord = pd.read_csv(patch + 'coord.csv')
# Приведение названий столбцов к нижнему регистру
coord.columns = coord.columns.str.lower()
#coord.head()
# Объединение датасетов по полю 'Город'
merged_df = pd.merge(df_us, coord, on='город', how='left')
merged_df['координаты'] = merged_df.apply(lambda row: f"[{row['широта']},{row['долгота']}]", axis=1)
#merged_df.head()
#Выгрузка объединенного датасета для дашборда
csv_filename = 'merg_coord.csv'
merged_df.to_csv(csv_filename, index=False)
#Создание ссылки для скачивания
download_link = FileLink(csv_filename)
#Отображение ссылки
download_link
Данное направление анализа является дополнением к дашборду созданному в помощь отделу рекламы (ссылка). Я хочу обратить внимание на неравномерность распределения донаций по стране, сделать выводы и дать рекомендации как исправить текущее положение дел. На мой взгляд важно повысить число донаций в отстающих регионах, т.к. это поможет сохранить жизни большему количеству людей находящихся в отдаленных регионах.
Для упрощения работы с визуализацией необходимо создать новые столбцы с информацией о способе авторизации доноров, составить сводные таблицы с подсчетом категорий и визуализировать их.
#Функция для создания нового столбца 'авторизация', с указанием авторизации через соц. сети
def combine_auth(row):
if row['авторизация_через_вк']:
return 'ВКонтакте'
elif row['авторизация_через_одноклассники']:
return 'Одноклассники'
elif row['авторизация_через_твиттер']:
return 'Твиттер'
elif row['авторизация_через_яндекс']:
return 'Яндекс'
elif row['авторизация_через_гугл']:
return 'Гугл'
else:
return 'Нет данных'
#Функция для создания нового столбца 'иное', где указана почта либо телефон
def more_auth(row):
if row['указан_email']:
return 'Email'
elif row['указан_телефон']:
return 'Телефон'
else:
return 'Нет данных'
#Создание нового столбца 'авторизация'
df_us['авторизация'] = df_us.apply(combine_auth, axis=1)
#Создание нового столбца 'иное'
df_us['иное'] = df_us.apply(more_auth, axis=1)
#Данные ТОЛЬКО ПОДТВЕРЖДЕННЫХ донаций не меньше 1
verificated_registration = df_us.query('подтверждённые_донации > 0')
#verificated_registration.head()
#Сводная таблица для построения графика с данными о авторизации
autorisation = verificated_registration.groupby('авторизация')['id'].count().reset_index()
autorisation = autorisation.sort_values(by='id', ascending=False)
autorisation
| авторизация | id | |
|---|---|---|
| 0 | ВКонтакте | 20888 |
| 2 | Нет данных | 13427 |
| 1 | Гугл | 2549 |
| 5 | Яндекс | 1014 |
| 3 | Одноклассники | 642 |
| 4 | Твиттер | 117 |
#Построение графика распределения доноров по способу авторизации
fig = px.bar(autorisation, x='авторизация', y='id', color='авторизация', text = 'id',
color_discrete_sequence=px.colors.qualitative.Set2_r)
fig.update_layout(title='Способ авторизации доноров с подтвержденными донациями',
xaxis_title='Название сервиса',
yaxis_title='Количество человек')
fig.show()
На графике показано количество людей с хотябы одной подтвержденной донацией, которые авторизовались в приложении по одной из указанных соц.сетей. Здесь прекрасно видно что подавляющее большинство людей пользуется контактом. На это стоит заострить внимание т.к. основной рекламный бюджет в таком случае целесообразно направить именно на эту соц. сеть. Таким образом мы получим больший прирост людей и "конверсию" доноров.
Так же наблюдается 13427 человек данных на авторизацию которых нет. Полагаю это связано с тем что они совершили авторизацию другим способом (например с помощью почты или номера телеофна). В следующем графике я проверю эту информацию.
#Сводная таблица для построения графика с данными о авторизации
other = verificated_registration.groupby('иное')['id'].count().reset_index()
other = other.sort_values(by='id', ascending=False)
other
| иное | id | |
|---|---|---|
| 0 | 30926 | |
| 2 | Телефон | 4793 |
| 1 | Нет данных | 2918 |
У полученой сводной таблицы есть нюанс. Она учитывает всех пользователей, указавших и не указавших соцсеть. А что если один заполнил все поля при регистрации а другой ничего? Данная таблица отображает общее количество людей с указанием почты или телефона, поэтому стоит создать отдельную, которая исключает наличие соцсети в таблице, это будет достоверной информацией о положении дел.
#Оставим лишь тех пользователей, которые не использовали соц.сети, и вошли в приложение с помощью телефона или почты
other_none = verificated_registration.query('авторизация == "Нет данных"')
#Сводная таблица людей указавших почту или телефон без использования соц. сетей
other_clean = other_none.groupby('иное')['id'].count().reset_index()
other_clean = other_clean.sort_values(by='id', ascending=False)
other_clean
| иное | id | |
|---|---|---|
| 0 | 8595 | |
| 2 | Телефон | 4099 |
| 1 | Нет данных | 733 |
#График с визуализайией сводной таблицы
plt.figure(figsize=(15, 7))
sns.barplot(x='id', y='иное', data=other_clean, palette='pastel')
plt.title('Количество людей вошедших с указанием почты или телефона')
plt.xlabel('Количество человек')
plt.ylabel('Способ верификации')
plt.xticks()
plt.legend(loc='lower right', fontsize=12)
plt.grid()
plt.show()
No artists with labels found to put in legend. Note that artists whose label start with an underscore are ignored when legend() is called with no argument.
Таким образом я получил информацию о количестве людей, которые воспользовались исключительно номером телефона или почтой, не авторизовываясь через соц. сети. Моё предположение оказалось верным,13427 отображаемых в колонке "нет данных" на прошлом графике авторизовались либо почтой либо номером телефона минуя указания соц. сетей (12 694 человека), но 733 человека не указали абсолютно никаких контактных данных. Вопрос, каким образом они в таком случае подтвердили донацию? Полагаю, что указывать контакты совершенно не обязательно для подтверждения донации, достаточно ввести ФИО и приложить справку (скорее всего и паспортные данные). Другого объяснения у меня нет.
Визуализация доноров на карте позволит понимать общую картину распределения, это даст возможность подумать над тем как улучшить положение в отстающих регионах и предположить в чем кроется причина не равномерного распределения доноров по стране.
#Следует использовать файл для выгрузки, т.к. в нем есть координаты местоположения точек приема крови.
#Фильтрация датасета по подтвержденным донациям
verificated_coord = merged_df.query('подтверждённые_донации > 0')
verificated_coord.rename(columns={'регион_x': 'регион'}, inplace=True)
#Приведение региона к нужному типу данных
verificated_coord['регион'].astype('str')
#verificated_coord.head()
38 Россия, Саха /Якутия/, Якутск
84 Россия, Москва
85 Россия, Москва
96 Россия, Крым, Симферополь
97 Россия, Москва
...
267711 Россия, Москва
267712 Россия, Санкт-Петербург
267714 Россия, Санкт-Петербург
267716 Россия, Санкт-Петербург
267717 Россия, Санкт-Петербург
Name: регион, Length: 39339, dtype: object
#Визуализация распределения доноров по стране
#Координаты нашего континента
eurasia = [54, 105]
#Создание карты с координатами континента
donation_map = Map(eurasia, zoom_start=3)
#Создаём пустой кластер, добавляем его на карту
marker_cluster = MarkerCluster().add_to(donation_map)
#Пишем функцию, которая принимает строку датафрейма,
#создаёт маркер в текущей точке и добавляет его в кластер marker_cluster
def create_clusters(row):
if not (np.isnan(row['широта']) or np.isnan(row['долгота'])): #Эта штука не пропускает значения NaN
Marker(
[row['широта'], row['долгота']], #указание строк с широтой и долготой
popup=f"{row['федеральный округ']} {row['область']} {row['город']} {row['население']}", #Здесь все необходимые отображаемые поля
).add_to(marker_cluster)
#Применяем функцию create_clusters() к каждой строке датафрейма
verificated_coord.apply(create_clusters, axis=1) #Применение функции к датафрейму
#Вывод карты на экран
donation_map